任何正文都可以说明为什么以下代码的输出为“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();
}
}
答案 0 :(得分:9)
首先,ClassA
的字段已初始化。
然后调用ClassA
的构造函数,调用ClassB.initHeader()
。
之后,ClassB
的字段会被初始化,覆盖initHeader()
已完成的内容。
答案 1 :(得分:1)
此代码无法从ClassB调用initHeader
,这是不正确的。
您可以通过向两个类的initHeader
方法添加调试输出来验证它。
public Object obj = null;
包含两部分:
public Object obj
obj = null
构造函数运行时已知的第一部分(此时obj默认初始化为null
)
第二部分在构造函数之后执行,因此在initHeader
之后执行并覆盖obj。
尝试将public Object obj = null;
替换为public Object obj;