必须写super(参数)是因为java要求子类实例创建前父类部分必须完成初始化,而父类无无参构造时编译器无法自动插入super(),否则报错“there is no default constructor available”。

当父类没有无参构造方法时,子类每个构造方法都必须显式调用 super(参数),且该调用必须作为构造方法的第一条语句。
为什么必须写 super(参数)?
Java 要求子类实例创建前,父类部分必须完成初始化。如果父类只提供了带参构造(比如 Parent(String name)),编译器无法自动插入 super()——因为这个调用根本不存在。此时不写 super(...),编译直接报错:“There is no default constructor available in 'XXX'”。
配置 super 的关键规则
-
必须放在第一行:哪怕前面只有注释或空行,
super(...)也得是第一个可执行语句 - 参数必须严格匹配父类某个构造方法的签名:类型、个数、顺序都要对得上
- 不能和 this() 共存:一个构造方法里只能选其一,二者都争“第一行”位置
-
每个子类构造方法都要独立处理:即使子类有多个构造,每个都得自己写对应的
super(...)
常见配置方式举例
假设父类定义如下:
class Person {
private String name;
private int age;
public Person(String name) { this.name = name; }
public Person(String name, int age) { this.name = name; this.age = age; }
}
那么子类可这样配置:
- 只调用单参数父构:
super("unknown") - 根据子类参数传递:
super(name, age) - 多个子类构造分别对应不同父构:
Child1() { super("default"); }
Child2(String n) { super(n); }
Child3(String n, int a) { super(n, a); }
怎么避免踩坑?
最稳妥的做法是:只要父类写了任意构造方法(哪怕只是 Parent() { }),就主动检查它是否还保留无参构造。如果不保留,就在子类中明确写出 super(...)——不依赖编译器隐式行为,代码更清晰、迁移更安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











