2
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 hn x。但输出是bh hn x

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

4

2 回答 2

3

您可能正在考虑对super()Java 插入构造函数的隐式调用。但请记住,Java 仅在需要时才这样做——也就是说,当您自己不调用另一个构造函数时。当您调用this()单参数House构造函数时,您已经在推迟到另一个构造函数,因此 Java 不会将调用插入到super()那里。

相反,在零参数构造函数House()中,您不会通过调用this(...)or来启动它super(...)。所以在那一个中​​,Java 确实为你插入了super()

最重要的是,Java 从不调用Building(String). 在对象的初始化过程中只调用了一个超类构造函数,它是一个没有参数的构造函数。

于 2010-07-13T03:59:15.203 回答
0

构造函数调用链的顺序为: 1. House(String name) 2. House() 3. Building()

生产产出 bh hn

然后是 printf 语句。x 导致最终输出 **bh hn x **

这是因为; 1. House(String name) 中有对构造函数 this() 的显式调用。这避免了 Java 插入的对 super() 的隐式调用。2. 构造函数 House() 中没有显式构造函数调用,导致 Java 插入对其超类构造函数 Building() 的隐式调用。这会在 House() 中的 printf 语句 **h ** 之前打印 **b **。

于 2010-07-13T06:01:59.767 回答