带块的Java类实例化
我有一个这样的基类
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
为空,为什么?我清楚地设定了它
# 1 楼答案
因为在子类构造函数之前调用了超类构造函数。因此
setBase()
在子类中的块初始化_基之前执行从基类构造函数调用可重写方法是您应该避免的事情,这正是因为您在该实践中面临的问题。而且还因为如果在子类中重写它,那么重写的实现将在尚未正确初始化的对象上调用