gpt4 book ai didi

java - 将 "private"添加到枚举字段会更改静态上下文

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:03 24 4
gpt4 key购买 nike

<分区>

我希望有人解释这个文件导致的编译错误:

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 是一个静态上下文(是吗?)并且删除 int x 上的访问修饰符会使它成为静态变量(是吗?)。为什么会这样?

环境:

  • Java 版本“1.8.0_51”

附注我正在尝试初始化枚举构造函数中的 Properties 字段,该字段委托(delegate)给每个枚举实例的抽象 init 方法。这就是我遇到上述错误消息的地方。我不希望 x/properties 成为静态字段;它对于每个枚举实例都应该是唯一的。

重复反驳

How to use fields in java enum by overriding the method?

首先,如果您不介意向权威机构提出上诉,Jon Skeet通过说“这很奇怪 - 我很惊讶覆盖被视为静态上下文”评论了这个问题。请注意,使字段 protected 会删除错误,这也很奇怪......“

据我所知 Rafael's excellent answer ,他从不解决这个奇怪的问题。是的,AB相当于静态嵌套类,但是一个静态内部类大致相当于一个普通的顶层类:并不代表所有的该类的方法和字段也是静态的。枚举的方法是在静态上下文中吗?所以在 Rafael 的回答中,doIt 方法实际上是静态方法,即使它们没有被标记为静态方法?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com