以下代码在编译和运行时将输出显示为“alpha subsub”。
SubSubAlpha();
构造函数应将“subsub”添加到变量s
,这应该是输出。
为什么输出是“alpha subsub”?
class Alpha {
static String s = " ";
protected Alpha() {
s += "alpha ";
}
}
public class SubSubAlpha extends Alpha {
private SubSubAlpha() {
s += "subsub ";
}
public static void main(String[] args) {
new SubSubAlpha();
System.out.println(s);
// This prints as " alpha subsub".
//Shouldn't this one be printed as " subsub"
//Who made the call to Alpha(); ?
}
}
答案 0 :(得分:1)
这是因为在创建对象时,会调用parent的构造函数,并且它会上升到Object类。你的Alpha内部扩展了Object类。所以首先调用SubSubAlpha构造函数,它调用Alpha构造函数,后者又调用Object构造函数,执行流从Object到Alpha,最后是SubSubAlpha
有关信息
构造函数调用层次结构是调用父类的构造函数然后调用子构造函数。但是如果你调用一个方法,它会在子类中搜索。如果在子类中找不到,则在父类中搜索该方法。
<强>参考强>
Order of Constructor Call
答案 1 :(得分:1)
当调用子类的构造函数时,第一条指令是对超类构造函数的调用。
因此,当您创建SubSubAlpha
对象时,Alpha
构造函数会将alpha添加到s
属性,然后SubSubAlpha
constructro会添加子目录
答案 2 :(得分:1)
让我稍微重写你的构造函数,而不会改变生成的字节码:
private SubSubAlpha() { super(); s += "subsub "; }
现在应该立即清楚执行什么以及以什么顺序执行。
答案 3 :(得分:1)
当存在类的层次结构时,子类的构造函数(在本例中为SubSubAlpha
)始终调用(第一个)超类的构造函数,在本例中为Alpha
。
实际上会发生什么:
private SubSubAlpha() {
super();
s += "subsub ";
}
因此,这使得:
s += "alpha ";
s += "subsub ";
使字符串“alpha subsub”