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

时间:2016-11-14 09:37:56

标签: 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();  
    }  
}

执行流程(我所知道):

  1. Parent类中从上到下标识实例成员。
  2. Child类中从上到下标识实例成员。
  3. Parent类中从上到下执行实例变量赋值和实例块。
  4. 执行Parent构造函数。
  5. Child类中从上到下执行实例变量赋值和实例块。
  6. 执行Child构造函数。
  7. 输出:

    10  
    Parent  
    20  
    

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

    10  
    Parent  
    20  
    Parent
    

2 个答案:

答案 0 :(得分:7)

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

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

尽管它的位置是子构造函数体的第一行,但在实例初始值设定项之前执行了<{1}} / this()语句。您应该将其视为与构造函数的其余部分有些分离。

答案 1 :(得分:0)

为什么要多次调用父构造函数?您只创建子类的一个实例,并调用父构造函数:

new Child() -> Child.super() -> Parent()

因此字符串&#34; Parent&#34;只被写入控制台一次。其他行动不属于各自的类别。构造