我有一个基类,比如这个
abstract class BaseClass {
protected Class<? extends iBase> _BASE = null;
protected static abstract class iBase {}
protected BaseClass() {
setBase();
}
protected void setBase() {
// use reflection to find fields, but...
// _BASE is null?
}
}
并使用此类
等类扩展它public class MyClass extends BaseClass {
{ // what is this called? Anonymous Block Class Statements?
_BASE = iBase.class;
} // does this get called before constructor starts?
public static class iBase extends BaseClass.iBase { // yes, it is hiding super
public static final String someValue = "";
}
public MyClass() {
super();
}
}
当我去实例化新类
时MyClass myClass = new MyClass();
_BASE
为空,为什么?我明确地设定了它
答案 0 :(得分:2)
因为超类构造函数在子类构造函数之前被称为。因此setBase()
在子类中初始化_BASE的块之前执行。
从基类构造函数中调用可重写的方法是您应该避免的,正是因为您在实践中遇到的问题。而且因为如果你在子类中覆盖它,那么将在一个尚未正确初始化的对象上调用被覆盖的实现。