考虑以下代码:
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();
}
我在前 2 个枚举常量声明(A 和 B)上得到编译时错误,但最后 2 个编译正常(C 和 D)。错误是:
A 行上的错误 1:无法从静态上下文中引用非静态变量 i
B 行上的错误 2:我在 E 中具有私有访问权限
由于get
是实例方法,我不明白为什么我不能i
以我想要的方式访问实例变量。
注意:private
从声明中删除关键字i
也会使代码可编译,我也不明白。
使用 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;
}