Java常量特定的类主体私有变量访问
为什么它不能编译,以及(相关地)为什么CC不能访问我认为(可能我错了)它自己的(私有)成员变量I,而AA和BB确实可以这样做? CC如何访问自己的成员变量 多谢各位Java常量特定的类主体私有变量访问,java,enums,static,Java,Enums,Static,为什么它不能编译,以及(相关地)为什么CC不能访问我认为(可能我错了)它自己的(私有)成员变量I,而AA和BB确实可以这样做? CC如何访问自己的成员变量 多谢各位 enum TestEnum { AA(1000), BB(500), CC(100) { public int getI() { return i + 1; } }; TestEnum(int i) { this.i = i; } private int i; publi
enum TestEnum {
AA(1000), BB(500), CC(100) {
public int getI() {
return i + 1;
}
};
TestEnum(int i) {
this.i = i;
}
private int i;
public int getI() {
return this.i;
}
}
javac输出:
TestEnum.java:6: error: non-static variable i cannot be referenced from a static context
public int getI() { return i + 1; }
^
1 error
使用super.getI()-1
,因为您希望覆盖父级的方法
public enum TestEnum {
AA(1000), BB(500), CC(100) {
@Override
public int getI() {
return super.getI() - 1;
}
};
private int i;
TestEnum(int i) {
this.i = i;
}
public int getI() {
return this.i;
}
}
或者,按照@oleg cherednik的建议,将字段
设置为protected
以直接访问它(返回i-1;
)。但是,我更喜欢上面的解决方案。您有两个选择:要么执行受保护的
字段,要么调用super.getId()
。我更喜欢做第一个,它更容易阅读注意:考虑像父类那样的枚举体,以及像子类那样的每个常量,因此您的私有字段在子类AA、BB、CC中不可见
public enum TestEnum {
AA(1000),
BB(500),
CC(100) {
@Override
public int getI() {
return i + 1;
}
};
protected final int i;
TestEnum(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
p.S.枚举中最好只有final
字段,因为枚举类似于常量,不应该有任何变量。为什么要有getI
两次?第一个的括号是什么?分号应直接位于CC(100)
之后。。。看:我是私人的,从技术上讲,我猜你是在制造一个亚型。尝试super.getI而不是i。这可能是正确的猜测,但是javac的输出指出了i是静态的这一事实,这在目前是没有意义的。另一个测试可能是使i
受保护
而不是私有
,这很快!啊,当然。非常感谢。这也表明TestEnum的每个实例(或枚举常量)实际上是一个子类,因为子类也不能访问其超类的私有变量。是这样吗?@JL_SO:请从@HovercraftFullOfEels中查看原因?@JL_SO:这样你可以1)投票支持这个答案,2)可能也会接受它。@HovercraftFullOfEels我已经尝试投票支持它了。我没有足够的分数或者他们在这里称之为什么。我努力想看看你在这里改变了什么。你应该在答案中加上一些文字。