JVM如何启动超类和子类中的字段?

时间:2013-02-07 07:47:25

标签: java jvm jls

任何正文都可以说明为什么以下代码的输出为“null”?什么是构造复杂Object并将细节委托给其子类的最佳方法?


package com.test;

public class ClassA {

    ClassA() {
        initHeader();
        initBody();
        initFooter();
    }

    void initHeader() {}

    void initBody() {}

    void initFooter() {}

    public static void main(String[] args) {
        ClassB a = new ClassB();
        System.out.println(a.obj);
    }
}

class ClassB extends ClassA {

    public Object obj = null;

    ClassB() {
        super();
    }

    void initHeader() {
        obj = new Object();
    }

}


2 个答案:

答案 0 :(得分:9)

首先,ClassA的字段已初始化。

然后调用ClassA的构造函数,调用ClassB.initHeader()

之后,ClassB的字段会被初始化,覆盖initHeader()已完成的内容。

答案 1 :(得分:1)

此代码无法从ClassB调用initHeader,这是不正确的。 您可以通过向两个类的initHeader方法添加调试输出来验证它。

public Object obj = null;包含两部分:

  1. 声明public Object obj
  2. 执行obj = null
  3. 构造函数运行时已知的第一部分(此时obj默认初始化为null) 第二部分在构造函数之后执行,因此在initHeader之后执行并覆盖obj。

    尝试将public Object obj = null;替换为public Object obj;