为何Java枚举变量名不能与枚举类名同名?常规类却可行
为什么Java枚举变量名不能和枚举类同名?
这个问题问得好!其实核心原因和Java的**名字遮蔽(Name Shadowing)**规则以及枚举的特殊性质有关,咱们一步步拆解清楚:
先看常规类的情况
比如你写这段代码是完全合法的:
// 变量名和类名同名,编译器允许 String String = "hello"; // 依然可以用new创建新实例,因为new后优先识别为类型 String anotherStr = new String("world");
这里变量名String确实遮蔽了类名String,但有个关键例外:在new关键字后面,编译器会强制解析为类型,所以不会影响实例化。当然,如果你尝试用这个变量名访问类的静态成员(比如String.valueOf(123))就会报错,因为此时String会被当成变量而非类。
再看枚举的特殊之处
枚举在Java里是特殊的类,所有枚举常量(比如你例子里的TYPE1)都是枚举类的静态成员。当你写someEnumType someEnumType = someEnumType.TYPE1;时,问题直接出在右边的someEnumType.TYPE1:
- 左边的变量名
someEnumType已经遮蔽了同名的枚举类名; - 编译器会把右边的
someEnumType解析为刚刚声明的变量(而不是枚举类),但这个变量是枚举的实例,不是类,自然无法访问静态成员TYPE1,所以直接编译报错。
为什么枚举的场景这个问题更突出?
因为使用枚举时,我们几乎总是通过类名来访问枚举常量(毕竟它们是静态的),而常规类除了静态成员,还可以通过new创建实例,不会完全依赖类名的直接引用,所以同名问题不会立刻触发错误。
正确的写法示例
只需要把变量名和枚举类名区分开就行:
someEnumType myEnumInstance = someEnumType.TYPE1;
内容的提问来源于stack exchange,提问作者adrijan971
相关产品推荐
相关产品推荐

