super()是子类构造器中调用父类构造器的关键语法,必须作为首条语句且仅出现一次,参数须严格匹配父类构造器签名,不可与this()共存,也不能用于静态上下文。

在 Java 中,super() 是子类构造器中调用父类构造器的关键语法,用于显式指定父类的初始化逻辑。它必须是子类构造器的第一条语句,否则编译报错。只有通过 super()(或 super(…) 带参形式),才能触发父类中你想要的那个构造器执行,从而完成特定的初始化流程。
必须放在构造器首行,且只能出现一次
Java 规定:如果子类构造器中要调用父类构造器,super() 或 super(参数) 必须是第一条可执行语句。编译器不会自动插入无参 super() —— 一旦你写了任意形式的 super(...),默认的隐式调用就失效;而如果你没写任何 super,又没有无参父类构造器,就会编译失败。
- ✅ 正确:
super("admin", 1001);(调用父类带两个参数的构造器) - ❌ 错误:
System.out.println("init"); super();(super 不在第一行) - ❌ 错误:
super(); super("test");(重复调用,只允许一个)
匹配父类存在的构造器签名
super(...) 的参数列表必须严格匹配父类中某个构造器的形参类型、个数和顺序。Java 不会自动类型提升或装箱来“凑”匹配,也不支持重载解析跨继承层级的模糊匹配。
- 若父类只有
public Person(String name),子类就不能写super(123)或super() - 若父类有
protected Animal(String type, int age),子类可写super("dog", 3),但不能写super("dog")(参数个数不匹配) - 注意访问权限:即使签名匹配,若父类构造器是
private,子类无法调用(编译错误)
常用于传递差异化初始化参数
子类往往需要把自身构造时接收的部分参数“转交”给父类,让父类完成共性字段的初始化,自己再处理特有逻辑。这是体现面向对象复用和分工的典型场景。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
例如:
父类class Vehicle {<br> protected String brand;<br> protected int year;<br> public Vehicle(String brand, int year) {<br> this.brand = brand;<br> this.year = year;<br> }<br>}
子类
class Car extends Vehicle {<br> private String model;<br> public Car(String brand, int year, String model) {<br> super(brand, year); // 把 brand 和 year 交给父类初始化<br> this.model = model; // 自己初始化特有字段<br> }<br>}
与 this() 不共存,且不能在静态上下文中使用
同一个构造器里,super(...) 和 this(...)(调用本类其他构造器)互斥,只能选其一。二者都要求位于首行,自然无法并存。另外,super 是实例相关操作,绝不能出现在静态方法、静态代码块或 static 字段初始化中。
- ✅ 可以:
public Sub() { super("default"); ... } - ❌ 不可以:
static { super(); }(编译错误) - ❌ 不可以:
public Sub() { this("x"); super("y"); }(编译错误)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










