带有块的Java类实例化

时间:2016-06-18 13:30:38

标签: java instantiation

我有一个基类,比如这个

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 个答案:

答案 0 :(得分:2)

因为超类构造函数在子类构造函数之前被称为。因此setBase()在子类中初始化_BASE的块之前执行。

从基类构造函数中调用可重写的方法是您应该避免的,正是因为您在实践中遇到的问题。而且因为如果你在子类中覆盖它,那么将在一个尚未正确初始化的对象上调用被覆盖的实现。