Java 加入“;“私人”;枚举字段更改静态上下文的步骤
我希望有人解释此文件导致的编译错误:Java 加入“;“私人”;枚举字段更改静态上下文的步骤,java,enums,Java,Enums,我希望有人解释此文件导致的编译错误: public enum TestEnum { A { @Override void someMethod() { System.out.println("A: " + x); } }, B { @Override void someMethod() { System.out.println("B: " + x
public enum TestEnum {
A {
@Override
void someMethod() {
System.out.println("A: " + x);
}
},
B {
@Override
void someMethod() {
System.out.println("B: " + x);
}
};
private int x;
abstract void someMethod();
}
编译错误是:
TestEnum.java:11: error: non-static variable x cannot be referenced from a static context
System.out.println("B: " + x);
如果删除private
修饰符,则类编译时不会出错。这似乎意味着someMethod
是一个静态上下文(是吗?),删除intx
上的访问修饰符使其成为一个静态变量(是吗?)。为什么会这样
环境:
- java版本“1.8.0_51”
Properties
字段,它将委托给每个枚举实例的抽象init
方法。这就是我遇到上述错误消息的地方。我不希望x/properties
成为一个静态字段;对于每个枚举实例,它应该是唯一的
重复反参数
首先,如果你不介意向权威机构提出上诉,在回答这个问题时,你会说“这很奇怪-我很惊讶覆盖被算作静态上下文。请注意,保护字段会删除错误,这也很奇怪…”
据我所知,他从来没有提到过这个奇怪的问题。是的,A
和B
相当于静态嵌套类,但是静态内部类大致相当于普通的顶级类:这并不意味着该类的所有方法和字段都是静态的。枚举的方法是否在静态上下文中?因此,在Rafael的回答中,doIt
方法实际上是静态方法,即使它们没有被标记为静态方法?试试这个
((TestEnum)this).x
错误消息具有误导性。问题是,private
字段没有被继承,因此x
或this.x
不会编译。您必须将它向上投射到超类才能访问它
另见
这里的“受保护”访问可能更好
protected int x;
我怀疑这是因为每个枚举值,例如
A
和B
,都被编译为TestEnum
的子类。子类无法访问父类的私有字段。但是为什么错误消息说someMethod
是静态上下文@NayukiMinase?我知道枚举实例大致相当于一个静态嵌套类,但这并不意味着它的所有方法都是静态的,不是吗?“static inner”在术语上是矛盾的。您的意思是“静态嵌套”。更正,谢谢@EJP。不要担心错误消息-当代码未编译时,编译器必须猜测程序员的意图。这不可能是准确的。