”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java子类总是需要显式调用超类构造函数吗?

Java子类总是需要显式调用超类构造函数吗?

发布于2024-11-09
浏览:663

Do Java Subclasses Always Need to Explicitly Call the Superclass Constructor?

在 Java 子类中必须显式调用超类构造函数吗?

定义子类时,常见的做法是看到显式调用超类构造函数使用 super() 的超类构造函数。然而,有人可能会问这是否有必要。

super()是编译器自动添加的吗?

是的,如果子类构造函数省略了对超类的调用构造函数时,编译器会自动调用超类中可访问的无参构造函数(no-args constructor)。此默认行为称为 构造函数链接

构造函数类型

  • 无参数构造函数:不带参数的构造函数。
  • 可访问的无参数构造函数: A超类中对子类可见的无参数构造函数(公共、受保护或包私有)。
  • 默认构造函数: 编译器在以下情况下添加的公共无参数构造函数类中没有显式构造函数。

什么时候需要 super() ?

使用仅当满足以下条件时才显式需要 super():

  • 超类没有可访问的无参数构造函数。
  • 子类构造函数包含参数,在这种情况下,它必须显式调用超类中接受这些参数的构造函数。

示例1:

public class Base {}
public class Derived extends Base {}

不需要显式调用 super(),因为 Base 有一个默认构造函数。

示例 2:

public class Base {
    public Base(int i) {}
}
public class Derived extends Base {
    public Derived(int i) {
        super(i); // Explicitly call the Base(int) constructor
    }
}

在这种情况下,需要 super(i),因为超类没有无参数构造函数,而子类构造函数需要为其 i 参数提供初始值。

通过理解这些概念,您可以避免不必要的 super() 调用并确保子类中正确的构造函数链接。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3