Consider the following code:
enum E {
A { public int get() { return i; } },
B { public int get() { return this.i; } },
C { public int get() { return super.i; } },
D { public int get() { return D.i; } };
private int i = 0;
E() { this.i = 1; }
public abstract int get();
}
我在前两个枚举常量(A和B)的声明处得到编译时错误,但最后两个(C和D)通过编译正常。错误如下:
第一个错误发生在A行: 非静态变量i不能从静态上下文引用
第二个错误发生在B行: i在E中具有私有访问权限
由于get
是一个实例方法,我不明白为什么我无法按照我想要的方式访问实例变量i
。
注意: 从i
的声明中去掉private
关键字也可以使代码可编译,这也让我感到困惑。
使用Oracle JDK 7u9。
编辑
正如评论中指出的那样,这与枚举无关,下面的代码产生了相同的行为:
class E {
static E a = new E() { public int get() { return i; } };
static E b = new E() { public int get() { return this.i; } };
static E c = new E() { public int get() { return super.i; } };
static E d = new E() { public int get() { return d.i; } };
private int i = 0;
}
return this.i;
代替A.i
。 - Marko Topolnikreturn this.i;
和return i;
无法编译,但是return super.i;
和return A.i;
可以。 - assyliasi
时有一定的搜索顺序,将其作为静态变量查找是最后的选择。这一步骤会找到i
,但会得出无法访问的结论,并将原因归因于错误的原因。这是错误报告中的一个漏洞,其根本原因仍然是访问规则的不当实现。 - Marko Topolnik