super()是对象初始化链的强制入口,确保父类字段正确初始化、避免半初始化状态,其必须位于构造器首行,构成Object→父类→子类的单向委托链。

因为子类对象在创建时,必须先完成父类部分的初始化,而 super() 是触发父类构造逻辑的唯一入口。
父类状态需要被正确初始化
子类继承了父类的字段(包括 private 字段),这些字段往往依赖父类构造方法来赋初值。比如父类中有个 private final String id,只在构造器里设置;如果不调用父类构造器,这个 id 就是 null 或默认值,后续使用会出错。
- Java 不允许对象处于“半初始化”状态——父类字段没设值、子类就直接运行自己的逻辑,可能引发 NullPointerException 或逻辑错误
- 哪怕父类没有显式定义构造方法,编译器也会插入一个默认无参构造器,目的就是保障这一初始化链存在
构造调用链是单向且强制的
每个类的构造方法第一行,要么是 super(...),要么是 this(...)(调用本类其他构造),二者不能共存,且都必须是首句。
- 这意味着初始化顺序固定:Object → 父类 → 子类,层层向上委托,不可跳过或逆序
- 如果子类不写 super(),编译器自动补 super();但如果父类根本没有匹配的无参构造,这行隐式调用就会失败,编译报错
- 多层继承时,GrandChild 只需调用 Child 的构造器,Child 内部再负责调用 Parent —— 每一层只对直接父类负责
避免设计漏洞和运行时不确定性
显式要求 super() 调用,本质上是一种静态检查机制,提前暴露继承设计问题。
立即学习“Java免费学习笔记(深入)”;
- 比如父类只提供带参构造(如 Parent(String name)),说明它不允许无意义的默认实例;子类若忽略 super(name),就违背了父类的设计意图
- 不强制 super(),可能导致子类误以为“父类不需要初始化”,结果字段未赋值、资源未申请、不变量未建立
- 所有构造器默认含隐式 super(),连 Object 类也不例外——这是 Java 对象模型的底层契约
不是语法糖,而是对象构建的硬性阶段
super() 不是可选的“调用父类方法”,而是对象内存布局中父类部分初始化的启动信号。
- new 表达式执行时,JVM 先分配整块内存(含父类字段空间),再按构造链逐层填充
- 在 super() 返回前,this 引用不能用于调用实例方法或访问未初始化字段,因为父类部分尚未就绪
- 所以 super() 必须在第一行——确保初始化动作最早发生,不被任何子类代码干扰


















