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

15 浏览
0 Comments

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

这个问题已经有了答案

为什么this()和super()必须是构造函数中的第一条语句?

我有以下两个类

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日
0
0 Comments

在构造过程中,始终会调用超类构造函数,保证子类构造函数被调用之前超类构造已经完成。这在大多数面向对象语言中都是这样的,如果你不想调用默认构造函数,可以显式地调用带有参数的超类构造函数;否则编译器会自动进行该调用。

0
0 Comments

这就是Java的工作原理。在调用子类的构造函数之前,从Object开始依次调用父类的构造函数。

引用官方文档

使用super()调用无参的父类构造函数;使用super(parameter list)调用与之匹配的有参父类构造函数。

注意:如果一个构造函数没有明确调用父类构造函数,Java编译器将自动插入调用父类的无参构造函数。如果父类没有无参构造函数,将会出现编译时错误。Object类有这样一个构造函数,所以如果它是唯一的父类,就没有问题。

如果子类构造函数显式或隐式地调用其父类的构造函数,则可能认为将调用一整个构造函数链,一直回溯到Object的构造函数。实际上,确实如此。这被称为构造函数链,当类的层次结构很长时,需要注意它。

0