有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带块的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) 个答案

  1. # 1 楼答案

    因为在子类构造函数之前调用了超类构造函数。因此setBase()在子类中的块初始化_基之前执行

    从基类构造函数调用可重写方法是您应该避免的事情,这正是因为您在该实践中面临的问题。而且还因为如果在子类中重写它,那么重写的实现将在尚未正确初始化的对象上调用