在没有构造函数的类上调用super()

4

我刚刚注意到,我在工作中分配的一个非常大的项目的代码库中,一个特定的类没有构造函数。但是它的子类调用了super()

有人可以解释一下,当子类调用super()但父类没有构造函数时会发生什么吗?

(我可以猜测效果就像调用一个空构造函数,但我想知道是否还有其他事情正在幕后进行)。


很惊讶之前没有人问过这样的问题。我认为这是一个好问题,一旦确定下来,应该锁定以供将来参考。 - C0D3
6个回答

4
如果您没有任何参数化构造函数,我是指严格没有构造函数,那么只有在这种情况下Java才会为您添加默认构造函数(一个没有参数的构造函数)。
每个构造函数必须调用其超类的构造函数。在子类构造函数中,在继承树上所有超类的构造函数被调用之前,您不能执行任何其他操作。因此,这个调用必须是您子类构造函数的第一行。如果您没有提供它,Java会再次为您完成。
请参见 为什么this()和super()必须是构造函数中的第一条语句?

2
第二段非常启发人心。 - Josh

2
如果一个类没有任何构造函数,则意味着它由Java编译器赋予了空构造函数。如果您放置了空构造函数,则编译器不会因为已经由您提供而重复生成。如果您想要自己的构造函数和参数,那么Java编译器将不会生成默认构造函数。更多关于构造函数的信息,请参考此处

2

在执行任何语句之前,子类构造函数总是首先调用其父类构造函数。如果父类中没有构造函数,则无论您是否显式调用它,Java编译器都会在代码中添加super()调用,并由JVM执行。


1
当一个类没有声明任何构造函数时,Java编译器将提供一个默认的无参构造函数。在基类构造函数中调用super()将调用该默认构造函数。

1

如果子类调用super(),但父类没有构造函数,那么会发生什么?

如果父类没有任何构造函数,则Java编译器将调用其默认构造函数。如果您不想调用默认构造函数,则可以在该类中创建自己的空构造函数。


默认构造函数不是空的吗? - Josh
是的,没错。但如果你想确认一下的话。 - Ronak Jain

1
如果你没有明确提供构造函数,编译器会在你的类中添加一个没有参数的默认构造函数。所以在你的情况下,它正在调用默认构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接