必须写super(...)是因为编译器默认插入super()调用父类无参构造,若父类无无参构造则失败,需显式调用匹配的带参构造且必须为首句。

在 Java 中,子类构造方法必须显式或隐式调用父类的构造方法。如果父类没有无参构造方法,而只有带参数的构造方法,那么子类构造方法中必须使用 super(...) 显式调用父类带参构造方法,且该语句必须是子类构造方法的第一条语句。
为什么必须写 super(...)?
Java 编译器会在每个构造方法开头自动插入 super()(即调用父类无参构造)。但如果父类没有无参构造方法,这条默认插入的语句就会编译失败。此时你必须手动写 super(实参),告诉编译器调用哪个父类构造方法。
怎么正确调用父类带参构造?
语法很简单:在子类构造方法的第一行写 super(对应参数),参数类型和顺序要与父类某个构造方法完全匹配。
- 必须放在子类构造方法的第一行,否则编译报错
- 只能出现一次,不能重复调用
- 参数个数、类型、顺序必须和父类某一个构造方法一致
- 不能和
this(...)(调用本类其他构造)共存于同一个构造方法中
一个典型例子
假设父类定义如下:
class Animal {Animal(String name) {
System.out.println("Animal 构造,名字:" + name);
}
}
子类必须这样写:
class Dog extends Animal {Dog(String name, String breed) {
super(name); // ✅ 正确:第一行调用父类带参构造
System.out.println("Dog 构造,品种:" + breed);
}
}
如果漏掉 super(name),或者把它写在第二行,都会编译失败。
常见错误提醒
-
super(...)写在第二行 → 编译错误:“call to super must be first statement” - 父类只有
Animal(String),子类却写super()→ 编译错误:“constructor Animal() is undefined” - 传入参数类型不匹配,比如传
int而父类要String→ 编译错误:“no suitable constructor found”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











