我在玩枚举时发现这段代码无法编译:
class TrafficLight{
enum Color{
RED(23){
private int y=5;
@Override
public int sum(){
return val+y;
}
},
GREEN(24);
private int val;
Color(int x){
val=x;
}
public int sum(){
return val;
}
}
}
错误是: non-static variable cannot be referenced from a static context
但是,如果我更改上的访问修饰符 val
为了保护代码编译没有问题。
我想弄明白为什么会这样。有人告诉我,我可以把枚举看作是一个带有匿名子类(每个离散值对应一个子类)的静态类。
我想它可能有点合适,因为如果字段受到保护,它可以从内部访问 RED
,但因为 RED
他没有自己的构造器,他自己的 val
不会初始化,所以如果 val
它是私有的,没有任何东西可以访问。
我想知道这是否是思考枚举的正确方法,以及我的解释是否有意义。
谢谢。
3条答案
按热度按时间plicqrtu1#
我认为枚举是不可变的值类,其中的值表示所有可能的示例。我甚至不知道可以将枚举子类化。
goqiplq22#
在java中,enum类是一个特殊的类,但它仍然遵循java范围。
在java中,子类不能从父类访问任何私有方法、变量。
对于上述问题,枚举
Red
正在扩展color类(并且只有枚举中的值才能对其进行扩展)。为了获取val
从Color
,您可以从到
4sup72z83#
由于语法歧义,编译器消息具有误导性。如果您将引用更改为
val
至this.val
,您应该得到更合适的消息:trafficlight.color.val字段不可见
它清楚地描述了这个问题。在这种情况下,保护它将解决编译错误。实际上是示例的类型
RED
是继承自的匿名类Color
. 如果var
是受保护的(或者实际上是非私有的),它将从RED
的匿名类。