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”
p、 我正在尝试初始化枚举构造函数中的
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。不要担心错误消息-当代码未编译时,编译器必须猜测程序员的意图。这不可能是准确的。