【问题标题】:Should super() be called implicitly or explicitly?应该隐式或显式调用 super() 吗?
【发布时间】:2013-09-12 02:34:48
【问题描述】:

我了解到,在构造对象的时候,super() 会被调用,不管你是否写在构造函数中。但我注意到在某些代码中,super() 方法被显式调用。我应该在构造函数中隐式还是显式调用super()?有什么不同?

【问题讨论】:

  • 没关系,除非您计划将参数传递给超类的构造函数。如果您忽略它,编译器会为您插入它。如果超类中没有默认 c'tor,那么您必须使用传递给它的适当参数显式调用它。
  • 感谢您的回答。我正在阅读 Exception 类的源代码,当我发现 Excetion 的默认构造函数内部只有一个 super() 时。我很困惑。现在我明白了。

标签: java constructor super


【解决方案1】:

我应该在构造函数中隐式还是显式调用 super() 方法?有什么不同?

调用super()与不调用之间没有语义差异,也没有性能差异。

这纯粹是一个外观问题。自己决定……或者按照项目采用的风格指南所说的(如果有的话)。


另一方面,如果您需要调用的super 有参数,那么显式调用它确实 很重要。如果超类没有无参数构造函数,那么你就不能显式或隐式地使用super()

【讨论】:

  • 现在我知道了很多
【解决方案2】:

如果讨论围绕 no-argument super() 构造函数,则没有区别。

如果没有显式调用,Java 会为所有基类构造函数隐式调用 super()。请记住,Java 始终只调用超类无参数构造函数。

在某些情况下,作为开发人员,您可能希望调用 基于参数的 超级构造函数。在这些情况下,您必须显式调用基于参数的超级构造函数,例如:super(arg1, arg2, ...)

IMO,避免调用无参数 super() 构造函数,因为它既不会影响逻辑,也不会提高可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2014-02-28
    • 1970-01-01
    • 2020-03-03
    相关资源
    最近更新 更多