在 Java 子类中必须显式调用超类构造函数吗?
定义子类时,常见的做法是看到显式调用超类构造函数使用 super() 的超类构造函数。然而,有人可能会问这是否有必要。
super()是编译器自动添加的吗?
是的,如果子类构造函数省略了对超类的调用构造函数时,编译器会自动调用超类中可访问的无参构造函数(no-args constructor)。此默认行为称为 构造函数链接。
构造函数类型
什么时候需要 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