代码:
Parent Class:
public class Parent {
int i = 10;
{
System.out.println(i);
}
public Parent(){
System.out.println("Parent");
}
}
Child Class:
public class Child extends Parent {
int j = 20;
{
System.out.println(j);
}
public Child() {
super();
}
}
Test Class:
public class ConstructorTest {
public static void main(String... args){
Child c = new Child();
}
}
执行流程(我所知道):
Parent
类中从上到下标识实例成员。 Child
类中从上到下标识实例成员。 Parent
类中从上到下执行实例变量赋值和实例块。 Parent
构造函数。 Child
类中从上到下执行实例变量赋值和实例块。 Child
构造函数。 输出:
10
Parent
20
我的问题是:在步骤6中 - 在执行Child
构造函数期间,为什么不使用super()
子进程再次调用父构造函数?
那么为什么输出不是:
10
Parent
20
Parent
答案 0 :(得分:7)
基本上,super()
行已在步骤4中生效。只有super();
是隐含的,通常会被删除。通常,您使用显式构造函数链接:
尽管它的位置是子构造函数体的第一行,但在实例初始值设定项之前执行了<{1}} / this()
语句。您应该将其视为与构造函数的其余部分有些分离。
答案 1 :(得分:0)
为什么要多次调用父构造函数?您只创建子类的一个实例,并调用父构造函数:
new Child() -> Child.super() -> Parent()
因此字符串&#34; Parent&#34;只被写入控制台一次。其他行动不属于各自的类别。构造