我知道构造函数中的第一个语句必须是super()(或this()),如果没有明确指定,编译器会为我们插入它。考虑到这一点,请参阅下面的代码:
class Building {
Building() { System.out.print("b "); }
Building(String 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 "); }
}
在main方法中,我调用了House类的重载构造函数,该构造函数接受一个String参数。由于this()已被调用,这意味着super()被非法调用。但是Building(String name)构造函数会发生什么?它也不必被调用吗?我知道这段代码有效并产生b h hn x
但是不需要调用超类的匹配构造函数吗?
答案 0 :(得分:3)
您需要调用基类的一个,也就是一个构造函数。在您的示例中,正如您所说的那样,将调用Building类的无参数构造函数。单参数构造函数不会被调用。
不需要在基类构造函数和派生类构造函数之间匹配参数名称或类型。
答案 1 :(得分:1)
让我们在代码的每一行添加数字,以便更容易解释指针执行代码的位置:
1 class Building {
2 Building() { System.out.print("b "); }
3 Building(String name) { }
4 }
5
6 public class House extends Building {
7
8 House() { System.out.print("h "); }
9 House(String name) { this(); System.out.print("hn " + name); }
10
11 public static void main(String[] args) { new House("x "); }
12 }
当您致电new House("x ");
时,会发生以下情况:
/*11*/ new House("x ") -- --> "b h hn x"
| |
/*9*/ this(); System.out.print("hn " + name); /* House(name) */
| ^
v |
/*8*/ super(); System.out.print("h "); /* House() */
| ^
v |
/*2*/ super(); System.out.print("b "); /* Building() */
| ^
v |
super() --------> /* Object() */
/* The super of Object() does nothing. let's go down. */
and all these calls will print : "b h hn x" as expected :)
每当你创建一个构造函数时,如果你没有明确地调用另一个构造函数,那么,super();
被称为
(在您的情况下,Building
的构造函数)。