调用哪个构造函数

时间:2019-05-14 10:00:00

标签: java oop constructor

假设以下代码。我不明白为什么输出是 B的构造函数被调用 A的构造函数被调用。

我以为输出只是“调用了A的构造函数”,因为构造A(int t)没有调用构造函数B?

public class Test {
    public static void main(String[] args) {
        A a = new A(3);
    }
}

class A extends B {
    public A(int t) {
        System.out.println("A's constructor is invoked");
    }
}

class B {
    public B() {
        System.out.println("B's constructor is invoked");
    }
}

3 个答案:

答案 0 :(得分:0)

无论何时调用派生类的默认构造函数,都会自动调用基类的默认构造函数,并且对参数化构造函数遵循相同的规则。这就是为什么要获取输出的原因: B的构造函数被调用。 A的构造函数被调用。

答案 1 :(得分:0)

  

super()由编译器自动添加到每个类构造函数中。

默认构造函数由编译器自动提供,但它也为第一条语句添加了super(),如图所示。因此,首先调用base的构造函数。

Refer to below picture to understand it.

答案 2 :(得分:0)

如果您未在子类构造函数中调用任何超类构造函数,则默认(无参数)构造函数调用将隐式添加为子类构造函数的第一条语句:

class A extends B {
    public A(int t) {
        super(); // Added by compiler
        System.out.println("A's constructor is invoked");
    }
}

如果超类没有no-args构造函数(无论是显式定义的还是隐式的),则会出现编译器错误,这意味着您必须显式调用现有的超类构造函数作为第一条语句在您的子类构造函数中。

  

隐式超级构造函数B()未定义。必须显式调用另一个构造函数

如果隐式的无参数构造函数没有显式定义的构造函数,则编译器会将其添加到类中。