0

我可以对此有一些反馈吗

鉴于“new House(“x”)”发送了一个字符串,我预计“House(String name)”构造函数会调用 Building 超类构造函数“Building(String name)”。在这种情况下,答案将是“bn xh hn x”。但是答案是“bh hn x”(是的,它确实与该输出一起运行)。

问题 1. 除了调用 "new Building("string_value")" 之外,House 还会调用 "Building(String name)" 构造函数吗?(即除了 House 构造函数中的附加代码?2.为什么调用无参数 Building 构造函数,而不是重载 Building (String name) 构造函数?我正在寻找的是可能有许多 Building 构造函数和可能需要从子类调用特定的超级构造函数。如何确保调用哪个构造函数(给定两个或多个选项)?

包含代码以方便参考。

答案是“bh hn x”

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 a[]) {
        new House("x "); }
}

问候斯科特

4

2 回答 2

0

如果没有提供显式的超类构造函数调用,也没有提供对同一类中的构造函数的调用,则始终调用无参数的超类构造函数。这就是 Java 的设计方式,JVM 记录第一个调用的构造函数并尝试将其与超类构造函数匹配起来太复杂且效率低下。

如果您需要调用不同的超类构造函数,您只需显式调用它,如下所示:

super(foo,bar);
于 2011-04-17T20:20:06.560 回答
0

从另一个类继承时,必须在构造函数中调用 super()。如果您不这样做,编译器将为您插入该调用,您可以清楚地看到。

调用超类构造函数是因为否则对象将处于未初始化状态。

您的程序执行顺序如下:

  1. 新房子(“x”);// 因为 this(),在 main 中调用 this 将调用同一个类的默认构造函数,因为你已经知道第一个语句必须是 this() 或 super(),如果有的话

  2. 在上面的构造函数中调用 this() 会执行 House() 构造函数。现在在 House() 中没有 this() 调用,因此编译器放置默认 super() 它将调用基类默认构造函数和

因此输出为 bh hn x

于 2011-04-17T20:30:32.437 回答