我刚刚回答了这个问题,说如何解决编译问题:
但我不明白为什么错误发生在一开始.
以下是以枚举形式编写的示例:
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();
}
Run Code Online (Sandbox Code Playgroud)
这与抽象类完全相同
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();
}
Run Code Online (Sandbox Code Playgroud)
在的情况下,FIRST在内部enum实现它无法访问someField.但是在抽象类的情况下它可以.
另外添加super修复问题,就像删除private字段上的修饰符一样.
有谁知道为什么这种轻微的怪癖会发生在行为中?
sp0*_*00m 15
你的抽象类不等同于你的枚举,因为枚举是隐式公共静态最终的.因此,如果您使用以下内容,您将观察到相同的行为:
abstract class MyClass {
static class FIRST extends MyClass {
@Override
public String doIt() {
return "1: " + someField; // error
}
};
static class SECOND extends MyClass {
@Override
public String doIt() {
return "2: " + super.someField; // no error
}
};
private String someField;
public abstract String doIt();
}
Run Code Online (Sandbox Code Playgroud)
如http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html中的 "静态嵌套类"一章所述:
静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们.
因此需要super.this如果字段protected不是,你也可以使用private.