Java 基于SCJP(考试310-065)课程的疑问
我认为输出必须是bn h hn x。但是输出是bhhnxJava 基于SCJP(考试310-065)课程的疑问,java,constructor,scjp,Java,Constructor,Scjp,我认为输出必须是bn h hn x。但是输出是bhhnx 我很困惑。这个输出是如何产生的。帮帮我吧您可能正在考虑Java插入构造函数的对super()的隐式调用。但请记住,Java只在需要时才这样做,也就是说,当您自己不调用另一个构造函数时。当您在一个参数House构造函数中调用this()时,您已经在遵从另一个构造函数,因此Java不会在那里插入对super()的调用 相反,在零参数构造函数House()中,一开始并不是调用this(…)或super(…)。在这个例子中,Java确实为您插入了
我很困惑。这个输出是如何产生的。帮帮我吧您可能正在考虑Java插入构造函数的对
super()
的隐式调用。但请记住,Java只在需要时才这样做,也就是说,当您自己不调用另一个构造函数时。当您在一个参数House
构造函数中调用this()
时,您已经在遵从另一个构造函数,因此Java不会在那里插入对super()
的调用
相反,在零参数构造函数House()
中,一开始并不是调用this(…)
或super(…)
。在这个例子中,Java确实为您插入了super()
总之,Java从不调用
构建(字符串)
。在对象初始化期间,只调用一个超类构造函数,它是一个没有参数的构造函数。构造函数调用链的顺序是:
1.House(字符串名称)
2.众议院()
3.建筑物()
生产量
b h hn
然后是printf语句。导致最终输出的x**b h hn x**
这是因为,;
1.在内部(字符串名)有一个对构造函数this()的显式调用。这避免了Java插入的对super()的隐式调用。
2.constructor House()中没有显式构造函数调用,因此Java无法插入对其超类构造函数Building()的隐式调用。这将在printf语句**h**内部()之前打印**b** 我们如何从House类中调用“Building(String name)”构造函数?通过将House(String name)
的第一行设置为besuper(name)
,您可以从House(String)
中调用Building(String)
。这必须替换对This()
的调用。
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 ");
}
}