【发布时间】:2014-07-29 08:25:09
【问题描述】:
我只是通过说如何解决编译问题来回答这个问题:
How to use fields in java enum by overriding the method?
但我不明白为什么首先会发生错误。
下面是写成枚举的例子:
public enum MyEnum {
FIRST {
@Override
public String doIt() {
return "1: " + someField; //error
}
},
SECOND {
@Override
public String doIt() {
return "2: " + super.someField; //no error
}
};
private String someField;
public abstract String doIt();
}
这和抽象类完全一样
abstract class MyClass {
class FIRST extends MyClass {
@Override
public String doIt() {
return "1: " + someField; //no error
}
};
class SECOND extends MyClass {
@Override
public String doIt() {
return "2: " + super.someField; //no error
}
};
private String someField;
public abstract String doIt();
}
对于FIRST 在enum 实现中的情况,它不能访问someField。但是在抽象类的情况下它可以。
另外添加super 可以解决问题,删除字段上的private 修饰符也是如此。
有谁知道为什么会出现这种轻微的怪癖?
【问题讨论】:
-
使用
this.someField而不是someField会为两种枚举/类情况生成相同的错误消息:The field Main.MyClass.someField is not visible。 -
那么在第一种情况下,您在创建对象时访问它,在第二种情况下作为子类访问它,对吧?
-
无法对非静态字段进行静态引用。