何时需要显式调用超类构造函数?

96

假设我有一个子类,继承自一个超类。在哪些情况下需要显式使用 super() 来运行超类构造函数呢?

我正在研究一本关于抽象类的书中的示例,当它们用非抽象的子类扩展时,子类的默认构造函数为空,并且有一个注释说将调用超类的默认构造函数。同时,在这里我也看到过有人的问题是没有显式调用 super()

是否区别于从子类的默认/非默认构造函数中调用超类的默认/非默认构造函数?


是我还是没有一个答案回答了这个问题:“为什么需要在子类中调用超类的构造函数”? - Ojonugwa Jude Ochalifu
3个回答

141

从来不需要只是

super();

如果你不指定其他内容,那将会有这样的情况。如果:

  • 你想调用一个带参数的超类构造函数
  • 你想链接到同一类中的另一个构造函数而不是超类构造函数

您声称:

与此同时,在这里我也见过某些例子,其中有人的问题并没有明确调用 super()。

你能给出任何例子吗?我无法想象这是怎么可能的...


4
是的,我应该更清楚地表达。这个(带有参数)非常好。感谢您的回答。 - jhlu87
你说得对。但是关于这个问题:‘同时我也看到过这里的情况,即某人的问题并没有明确调用super()。’ 这种情况发生在父类构造函数没有无参构造函数的情况下。在这种情况下,如果你不明确调用super(),就会出现错误。 - ACV
1
@ACV:在那里明确调用 super() 也不起作用。调用带有非空参数列表的超级构造函数会起作用,但仅使用 super() 不会起作用。 - Jon Skeet
@JonSkeet 有时我在我的代码中看到很多super()。每当我看到它们时,我几乎是机械地将其删除。然而,我不禁想知道它们存在的原因。您能否想到一种情况,在这种情况下,您实际上需要这些无参数的构造函数呢? - patrik
@patrik:要求构造函数存在和要求显式委托给无参超类构造函数之间是有区别的。后者是一种风格问题——你更喜欢明确/显而易见还是简洁。 - Jon Skeet

12
如果您没有显式调用超类构造函数,则会调用无参数构造函数(super())。这意味着,如果超类中没有可访问的无参数构造函数,则必须自己调用特定的构造函数。
但是,通常情况下,即使可以使用默认构造函数,您仍然希望使用不同的构造函数-这取决于您的代码。
还要注意,如果未声明构造函数,则编译器会自动生成一个公共默认构造函数,但一旦您编写自己的构造函数,就不会再自动生成默认构造函数。

1
只是为了确保我理解。如果在我的超类中,我有一个构造函数,并且它不是默认构造函数(比如它需要一个参数)。那么在我的子类构造函数中,我需要显式调用super(param),因为编译器将不再为超类生成默认构造函数? - jhlu87

4
< p > < code > super() 方法总是在子类的构造函数中调用,即使它没有在代码中显式地写出来。

< p >唯一需要写它的时候是,如果超类中有几个具有不同初始化参数的super(...)方法。


7
不是这样的。只要超类中有一个可达的比它少一个参数的构造函数,你就可以拥有另外一百个构造函数而不会有任何问题。原文:"The only time you need to write it, is if there are several super(...) methods in the superclass with different initialization parameters." - Voo

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