Java - 构造函数不显式调用超类构造函数,Java也不插入

时间:2014-08-16 12:48:36

标签: java class inheritance constructor superclass

首先,这是我在docs.oracle.com

上读到的内容

注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。

但是当我测试我的代码时,class B 的无参数构造函数没有超类构造函数而且Java没有添加一个。为什么这样?这就是我的预期:

   public B(){
        super(); //<--- Why didn't Java add this superclass constructor? 
        this(false);
        System.out.println("b1");
    }

它是否与公共B()&#34;构造函数调用另一个构造函数,该构造函数调用另一个具有超类构造函数的构造函数吗?

我得到的输出是:a2 A1 B2 B3 B1 C1 a2 A1 B2 B3 B1 C1 C2

public class App {
    public static void main(String[] args){
        new C();
        new C(1.0);
    }
}

A类

public class A {
    public A(){
        this(5);
        System.out.println("a1");
    }

    public A(int x){
        System.out.println("a2");
    }
}

B类

public class B extends A {
    public B(){
        this(false);
        System.out.println("b1");
    }

    public B(int x){
        super();
        System.out.println("b2");
    }

    public B(boolean b){
        this(2);
        System.out.println("b3");
    }
}

C类

public class C extends B {
    public C(){
        System.out.println("c1");
    }

    public C(double x){
        this();
        System.out.println("c2");
    }
}

1 个答案:

答案 0 :(得分:4)

this(args)的调用在其他任何事情之前进行评估。因此B()调用B(boolean),调用B(int),明确调用super()