基于SCJP程序的怀疑(考试310-065)

时间:2010-07-13 03:52:57

标签: java constructor scjp

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

我很困惑。这个输出是怎么来的。帮帮我

2 个答案:

答案 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 **。