为什么超类构造函数总是被调用?
为什么超类构造函数总是被调用?
这个问题已经有了答案:
我有以下两个类
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
但是这显然是不正确的。
admin 更改状态以发布 2023年5月23日
这就是Java的工作原理。在调用子类的构造函数之前,从Object
开始依次调用父类的构造函数。
引用官方文档:
使用
super()
调用无参的父类构造函数;使用super(parameter list)
调用与之匹配的有参父类构造函数。注意:如果一个构造函数没有明确调用父类构造函数,Java编译器将自动插入调用父类的无参构造函数。如果父类没有无参构造函数,将会出现编译时错误。
Object
类有这样一个构造函数,所以如果它是唯一的父类,就没有问题。如果子类构造函数显式或隐式地调用其父类的构造函数,则可能认为将调用一整个构造函数链,一直回溯到
Object
的构造函数。实际上,确实如此。这被称为构造函数链,当类的层次结构很长时,需要注意它。