Java:子类构造函数的super()如何/何时参与实例流程?

Uts*_*Uts 0 java constructor

码:

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();  
    }  
}
Run Code Online (Sandbox Code Playgroud)

执行流程(我所知道):

  1. ParentClass中从上到下识别实例成员.
  2. ChildClass中从上到下识别实例成员.
  3. ParentClass中从上到下执行实例变量赋值和实例块.
  4. 执行Parent构造函数.
  5. Child类中从上到下执行实例变量赋值和实例块.
  6. 执行Child构造函数.

输出:

10  
Parent  
20  
Run Code Online (Sandbox Code Playgroud)

我的问题是:在步骤6中 - 在执行Child构造函数期间,为什么不使用super()child 再次调用父构造函数?
那么为什么输出不是:

10  
Parent  
20  
Parent
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

super()线基本上已在步骤4中生效.只是super();隐含的,通常会被删除.通常,您使用显式构造函数链接:

  • 链接到同一个类中的构造函数
  • 为构造函数提供参数

尽管它的位置是子构造函数体的第一行,但在实例初始化器之前执行this()/ super()语句.您应该将其视为与构造函数的其余部分有些分离.