必须显式调用父类构造函数,因为若父类无无参构造函数且子类未写super(),编译器无法自动插入super(),导致编译错误;super()必须为首行语句,且参数需匹配父类构造函数签名。

在 Java 中,子类构造函数中显式调用父类构造函数,必须使用 super() 语句,且该语句必须是子类构造函数中的**第一条可执行语句**。
为什么必须显式调用?
Java 编译器会在每个构造函数开头自动插入 super()(无参调用),前提是父类有无参构造函数。如果父类**没有无参构造函数**,而子类构造函数又没写 super(...),编译就会报错:“Implicit super constructor XXX() is undefined”。此时必须显式调用父类存在的某个构造函数。
怎么写 super()?
根据父类构造函数的参数签名,匹配调用:
-
调用父类无参构造函数:
super(); -
调用父类带参构造函数:
super(参数1, 参数2, ...);,参数类型和顺序需与父类构造函数一致 - 不能同时出现 super() 和 this():一个构造函数里只能有一个“构造器调用”,且必须是首行
常见错误示例
以下写法会编译失败:
- 把
super(...)写在第二行或之后 → 报错:“Call to super must be first statement” - 父类只有
public Person(String name, int age),子类却只写super();→ 报错:“Constructor Person() is undefined” - 在构造函数中先赋值、再调用
super()→ 不允许,必须首行
实际例子
假设父类:
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
子类必须显式调用:
class Dog extends Animal {
int age;
Dog(String name, int age) {
super(name); // ✅ 正确:显式调用父类含参构造
this.age = age;
}
}
若删掉 super(name),编译直接失败,因为 Animal 没有无参构造函数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











