super是子类初始化父类的唯一合法入口,必须位于构造器首行;若父类无无参构造器则super(...)不可省略;初始化顺序严格先父后子;super不能在静态上下文中使用。

在 Java 继承中,super 是子类初始化父类的唯一合法入口,它不是普通方法调用,而是构造器链式委托机制的核心。关键不在于“能不能”,而在于“必须怎么做”——否则编译直接报错。
super() 必须是子类构造器的第一行
Java 规定:任何子类构造器中,若要显式调用父类构造器,super(...) 必须出现在第一行。一旦写错位置(比如放在变量赋值或打印语句之后),编译器立刻拒绝:
- 正确写法:super(name, age); —— 紧跟在
{后面 - 错误写法:
this.id = 100; super(name, age);—— 编译失败
父类无无参构造器时,super(...) 不可省略
如果父类只定义了有参构造器(例如 Person(String name, int age)),而没写无参构造器,那么子类构造器里必须显式写出 super(...),传入匹配参数。否则编译器会自动插入 super()(无参调用),但父类根本没有这个构造器,导致编译错误:
- 父类只有
public Person(String n) { ... }→ 子类必须写super("Alice") - 父类同时有
Person()和Person(String)→ 子类可选是否写super()(默认已隐含)
初始化顺序不可逆:先父后子
super 调用触发的是父类构造逻辑执行,这意味着:
- 父类字段先完成赋值(如
this.name = n;) - 父类实例初始化块(
{...})和构造器体内的代码全部跑完 - 之后才轮到子类自己的字段初始化和构造器剩余代码
- 因此,子类构造器中不能在
super(...)前访问任何可能依赖父类状态的逻辑
注意 super 不是对象,也不能在静态上下文中使用
super 只能在非静态方法或构造器中出现,代表“当前对象的父类部分”。它不能:
- 出现在 static 方法、static 块或静态字段初始化中
- 被赋值给变量(
Object s = super;❌) - 用于调用父类 private 方法或访问 private 字段(权限限制,不是 super 的问题)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











