Java 基于SCJP(考试310-065)课程的疑问

Java 基于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确实为您插入了

我认为输出必须是bn h hn x。但是输出是bhhnx


我很困惑。这个输出是如何产生的。帮帮我吧

您可能正在考虑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)
的第一行设置为
be
super(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 ");
    }
}