Java 什么时候需要显式调用超类构造函数?

Java 什么时候需要显式调用超类构造函数?,java,constructor,subclass,superclass,Java,Constructor,Subclass,Superclass,假设我有一个子类,它扩展了一个超类。在什么情况下,我需要显式键入super(),才能运行超类构造函数 我正在看一本关于抽象类的书中的一个例子,当他们用一个非抽象子类扩展它时,子类的默认构造函数是空的,并且有一条注释说将调用超类的默认构造函数。同时,我在这里也看到了一些实例,其中有人的问题不是显式调用super() 调用超类的默认/非默认构造函数与子类的默认/非默认构造函数的区别是什么?如果不显式调用超级构造函数,将调用无参数构造函数(super())。这意味着,如果超类没有可到达的无参数构造函数

假设我有一个子类,它扩展了一个超类。在什么情况下,我需要显式键入
super()
,才能运行超类构造函数

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


调用超类的默认/非默认构造函数与子类的默认/非默认构造函数的区别是什么?

如果不显式调用超级构造函数,将调用无参数构造函数(super())。这意味着,如果超类没有可到达的无参数构造函数,则必须自己调用特定的构造函数

但通常情况下,您需要一个不同的构造函数,即使您可以使用默认构造函数,这取决于您的代码

还要注意的是,如果没有声明构造函数,编译器会自动生成一个公共默认构造函数,但一旦您编写了自己的构造函数,这种情况就不再发生了。

您永远不需要

super();
如果您不指定任何其他内容,就会出现这种情况。只有在以下情况下,才需要指定要调用的构造函数:

  • 您希望调用具有参数的超类构造函数
  • 您希望链接到同一类中的另一个构造函数,而不是超类构造函数
你声称:

同时,我在这里也看到了一些实例,其中有人的问题不是显式调用super()

你能举些例子吗?我无法想象这怎么可能…

方法总是在子类的构造函数中调用,
super()
方法,即使它不是显式地用代码编写的


您需要编写它的唯一时间是,在超类中是否有多个具有不同初始化参数的
super(…)
方法。

“您需要编写它的唯一时间是,在超类中是否有多个具有不同初始化参数的super(…)方法。”不正确。只要有一个可到达的无参数构造函数,你就可以有一百个其他的构造函数,没有任何问题。是的,我应该更清楚。这是超级(有争论)。谢谢你的回答,你是对的。但关于这一点:“同时,我也在这里看到一些实例,其中有人的问题不是显式调用super()。”当父构造函数没有noarg构造函数时,就会发生这种情况。在这种情况下,如果不显式调用super(),您将得到一个错误。@ACV:显式调用
super()
在那里也不起作用。使用非空参数列表调用超级构造函数是可行的,但仅仅使用
super()
是不行的。@JonSkeet有时会在我使用的代码中看到很多
super()
s。每当我看到它们,我几乎都会从临床上移除它们。然而,我不禁想知道他们为什么会在那里。你能想象一个你真的想要这些无参数构造函数的例子吗?@patrik:好吧,要求构造函数存在和要求显式委托给无参数超级构造函数是有区别的。后者是风格的问题——无论你喜欢明确/明显还是简短。只是为了确保我理解。如果在我的超类中,我有一个构造函数,它不是默认的构造函数(假设它接受一个参数)。然后在我的子类构造函数中,我需要显式调用super(param),因为编译器将不再为该超类生成默认构造函数?是我还是没有一个答案解决了“为什么需要在子类中调用超类的构造函数”的问题