必须显式调用父类有参构造器,因为当父类无无参构造器时,编译器默认插入的super()会失败;super(参数)须为子类构造器首句,且参数须与父类有参构造器完全匹配。

在子类构造器中,必须用 super(参数列表) 显式调用父类的有参构造器,且该语句必须是子类构造器的第一条语句。
为什么必须显式调用父类有参构造器
当父类没有无参构造器(即只定义了有参构造器),而子类构造器中又没写 super(...) 时,编译器会默认插入 super() —— 但此时父类根本没有无参构造器,导致编译失败。因此,必须手动写 super(对应参数) 来匹配父类已有的构造器。
调用语法和位置要求
- super(...) 必须出现在子类构造器的第一行,否则编译报错
- 括号内的实参类型、个数、顺序需与父类某个有参构造器完全一致
- 不能在构造器其他位置(如 if 块、循环内)或普通方法中使用 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),或把它写在第二行,都会编译失败。
常见错误提醒
- 误写成 this(...)(那是调用本类其他构造器,不是父类)
- 参数类型不匹配,例如传入 super(123) 但父类构造器要 String
- 父类构造器被声明为 private,此时子类无法访问,也不能 super 调用

















