class Building{
Building(){
System.out.print("b ");
}
Building(String name){
this();
System.out.print("bn "+name);
}
}
public class House extends Building{
House(){
System.out.print("h ");
}
House(String name){
this();
System.out.print("hn "+name);
}
public static void main(String[] args){
new House("x ");
}
}
我认为输出必须 b bn h x x 。但输出 b h h x x 。
我很困惑。这个输出是怎么来的。帮帮我
答案 0 :(得分:3)
您可能正在考虑Java向构造函数中插入super()
的隐式调用。但请记住,Java只在需要时才这样做 - 也就是说,当你不自己调用另一个构造函数时。当您在单参数this()
构造函数中调用House
时,您已经推迟到另一个构造函数,因此Java不会在那里插入对super()
的调用。
相反,在零参数构造函数House()
中,您不会通过调用this(...)
或super(...)
来启动它。所以在那个,Java确实会为你插入super()
。
最重要的是,Java从不调用Building(String)
。在对象初始化期间只调用一个超类构造函数,而它是没有参数的构造函数。
答案 1 :(得分:0)
构造函数调用链的顺序是: 1.房子(字符串名称) 2.房子() 3.建筑()
产生输出 b h hn
后跟printf语句。 x导致最终输出** b h hn x **
这是因为; 1.在House(字符串名称)中显式调用构造函数this()。这避免了对Java插入的super()的隐式调用。 2.构造函数House()中没有显式的构造函数调用,导致Java向其超类构造函数Building()插入一个隐式调用。这会在House()中的printf语句** h **之前打印** b **。