[英]Java - accessing private fields of enum from overridden methods
我在玩枚举,我发现这段代码无法编译:
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
上的访问修饰符以保护代码编译没有问题。
我试图理解为什么会发生这种情况。 有人告诉我,我可以将枚举视为具有匿名子类(每个离散值一个子类)的 static class。
我想它可能有点合适,因为如果该字段受到保护,它可以从RED
内部访问,但因为RED
没有自己的构造函数,他自己的val
不会被初始化,所以如果val
是私有的,它不会没有任何东西可以访问。
我想知道这是否是思考枚举的正确方法,以及我的解释是否合理。
非常感谢。
我认为枚举是不可变的值类,其中的值代表所有可能的实例。 我什至不知道可以对枚举进行子类化。
由于语法歧义,编译器消息具有误导性。 如果您将对val
的引用更改为this.val
,您应该会收到更合适的消息:
字段 TrafficLight.Color.val 不可见
这清楚地描述了这个问题。 在这种情况下,使其受保护将解决编译错误。 实际上,实例RED
的类型是继承自Color
的匿名 class 。 如果var
是受保护的(或者实际上是非私有的),它将从RED
的匿名 class 的代码中可见。
In Java, Enum class is a special class but it still compliance with Java scope.
在 Java 中,子 class 无法访问任何私有方法,来自父 class 的变量。
对于上述问题, enum Red
正在扩展 Color class (并且只有 enum 中的值可以扩展它)。 为了从Color
访问val
的值,您可以将 scope 从
private int val;
至
int val;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.