【发布时间】:2012-12-17 19:11:37
【问题描述】:
考虑以下代码:
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。
注意:从i 的声明中删除private 关键字也会使代码可编译,我也不明白。
使用 Oracle JDK 7u9。
编辑
正如 cmets 中所指出的,这并不特定于枚举,下面的代码会产生相同的行为:
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;
}
【问题讨论】:
-
这里有同样的问题。过了很久,我还是骗自己说我知道java中的枚举 :)
-
要获得更多乐趣,请尝试使用
return this.i;而不是A.i。 -
@MarkoTopolnik
return this.i;和return i;不编译,但return super.i;和return A.i;编译。 -
没错,它们每个都因不同的错误而失败!那是“更有趣”的部分:)
-
assylias,请注意您的错误不是特定于枚举的。尝试 Evgeniy 答案中的代码,它会产生与常规类完全相同的编译器错误。