Java 当super()什么都不做时调用它

Java 当super()什么都不做时调用它,java,inheritance,constructor,Java,Inheritance,Constructor,当超级构造函数什么都不做时,从构造函数中调用超级类的构造函数有什么意义 Java API正在做这件事——首先是看到了ArrayList, 调用自己的抽象列表的构造函数 protected AbstractList() { } 是抽象列表的唯一构造函数 如果没有super()调用,它无论如何都会运行——并且具有相同的效果 蒂亚 我认为没有意义。我见过一些IDE自动生成代码,在不需要时使用显式调用super()。我希望他们不会。这是一种我不喜欢的编码风格。对于默认的超类构造函数,这只是一个

当超级构造函数什么都不做时,从构造函数中调用超级类的构造函数有什么意义

Java API正在做这件事——首先是看到了ArrayList, 调用自己的
抽象列表
的构造函数

 protected AbstractList() {    }
抽象列表
的唯一构造函数

如果没有
super()
调用,它无论如何都会运行——并且具有相同的效果


蒂亚

我认为没有意义。我见过一些IDE自动生成代码,在不需要时使用显式调用
super()
。我希望他们不会。这是一种我不喜欢的编码风格。

对于默认的超类构造函数,这只是一个风格问题。如果在构造函数的开头没有调用另一个构造函数(无论是
super(…)
还是
this(…)
),那么编译器会自动插入对
super()
的调用。(唯一不受此规则约束的类是
java.lang.Object

您的子类将调用超类,即使您不在子类的构造函数中调用super()。

首先,始终调用超级构造函数,除非您使用
this()
调用另一个构造函数。如果您没有在构造函数的开头键入
super()
,编译器将在那里为您键入。(我的意思是它将编译文件,就像您在那里键入一样)


此外,如果你问为什么超级构造函数什么都不做就被调用,这是因为(其中一个原因)超类可以改变,构造函数可以在新版本中做一些事情,而且不用重新编译子类,你已经调用了超级构造函数。

我认为没有任何实际的理由使用它,就其本身而言,因为您是正确的-如果没有显式地进行
super()
构造函数调用,它将自动被调用


然而,我在这里扮演魔鬼代言人的角色,我喜欢调用
super()
,因为它更清楚初始化实际上是如何发生的。我发现这一点尤其正确,当你有新的Java开发人员,他们可能会在你完成这段代码后接管这段代码时——没有经验的开发人员将不太容易对实际初始化的方式做出错误的假设,这通常值得付出过度具体的小代价。

@JustinKSU它是链接的thx。实际上,如果您的构造函数以调用同一类中的另一个构造函数开始(如:
this(…);
),那么编译器将不会插入对超类构造函数的调用。@TedHopp谢谢,我没有意识到这一点。我已经编辑了答案。@TedHopp-当你打电话时会发生什么事?
这个(…)
是你不能打
super(…)
——一个或另一个。当没有显式调用时,总是调用默认的超级构造函数。sry——但这是错误的&看起来是“对的”。@Roam当你调用
this()
作为构造函数中的第一条语句时,你是在推迟对另一个构造函数的
super()
调用。我还想说,我不是一个自动装箱的超级粉丝,出于这个原因,对于其他人,我会保留一个不同的答案:)“清晰性”是对的,n似乎是唯一的原因。:)父构造函数总是被实际调用——无论是否调用
this(…)
@Roam——这是不正确的。调用
this(…)
时,如果被调用的构造函数不调用另一个
this(…)
,它将调用超类构造函数。如果原始构造函数也调用了
super()
,那么将有两个超类构造函数调用,而这不会发生。对于仅有条件插入的调用非常明确:“如果构造函数体不是以显式构造函数调用开头的……”。ans读取对此(…)的调用,无论发生什么情况,都避免调用super(…)。可以在构造函数中调用super()或this(),也可以不调用任何函数——bth不能。我同意你所说的其余内容。@Roam-Calling
这个(…)
实际上避免了为该构造函数调用
super()
。对超类构造函数的调用发生在
this(…)
调用链的末尾。(因为一个类只能有有限数量的构造函数,所以链在某个地方结束。编译器会抱怨递归构造函数调用。)我没有说过(我相信也没有暗示)有办法避免调用超类构造函数。