为什么总是调用超类构造函数12

我有以下2节课

public class classA {
    classA() {
        System.out.println("A");
    }
}

class classB extends classA {
    classB() {
        System.out.println("B");
    }
}

然后运行

1

classA c = new classB();

2

classB c = new classB(); 

总是给予

A
B

为什么会发生这种情况?乍一看,在任何一种情况下,我都假设只会调用构造函数,因此唯一的输出将是classB

B

但这显然是错误的。


答案 1

这就是Java的工作原理。在调用子类的构造函数之前,将调用父类的构造函数,一直到类层次结构。Object

引用文档

使用 ,则调用超类无参数构造函数。使用 ,则调用具有匹配参数列表的超类构造函数。super()super(parameter list)

注: 如果构造函数未显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,您将收到编译时错误。 确实有这样的构造函数,所以如果是唯一的超类,就没有问题。ObjectObject

如果子类构造函数显式或隐式地调用其超类的构造函数,您可能会认为将有一整串构造函数被调用,一直回到 的构造函数。事实上,情况确实如此。它被称为构造函数链接,当存在一长串的类下降时,您需要注意它。Object


答案 2

在构造过程中始终调用超类构造函数,并保证在调用子类构造函数之前完成超类构造函数。大多数(如果不是全部)面向对象语言都是如此。如果您不想调用默认构造函数,则可以使用参数显式调用超类构造函数;否则,编译器会自动进行此类调用。


推荐