3

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


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();
    }

}


4

2 回答 2

9

首先,ClassA初始化 的字段。

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

之后,字段的ClassB初始化覆盖initHeader()所做的事情。

于 2013-02-07T07:53:46.643 回答
1

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

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

  1. 宣言public Object obj
  2. 执行obj = null

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

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

于 2013-02-07T08:04:07.703 回答