首页 > 解决方案 > 调用了哪个构造函数

问题描述

假设以下代码。我不明白为什么输出是 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");
    }
}

标签: javaoopconstructor

解决方案


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

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

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

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

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


推荐阅读