java要求子类构造器首行必须调用super()以确保父类初始化优先,编译器会隐式插入super()仅当父类有可访问无参构造器,否则需显式调用;super()与this()互斥,因jvm只允许唯一构造器链起点。

因为 Java 要求对象在可用前,其继承链上的所有父类部分必须完成初始化。子类对象本质上“包含”父类的状态和行为,这些状态(字段)需要通过父类构造器来正确设置——比如父类中 private 字段、final 字段或需校验的初始化逻辑,都只能在父类构造器中执行。
确保父类初始化优先于子类
JVM 在创建子类实例时,会按继承顺序从上到下初始化:先分配内存,再调用最顶层父类构造器,逐级向下。如果允许子类构造器先执行自己的代码(比如访问 this.name),而父类字段尚未初始化,就会导致未定义行为或空指针异常。把 super() 强制放在第一行,是从语法层面封锁这种风险。
编译器自动补全的隐式规则
当你没写任何 super(...) 或 this(...) 时,编译器会在子类构造器首行悄悄插入 super()——但前提是父类存在可访问的无参构造器。这个默认行为不是“可选优化”,而是 Java 规范强制要求的初始化起点。
- 父类有无参构造器 → 编译器自动加 super()
- 父类只有带参构造器 → 编译器无法插入有效 super(),必须由你显式写 super(参数)
- 父类构造器是 private → 子类无法继承,也无法用 super 调用,此时不能直接继承该类
不调用 super 就无法构建合法对象
Java 中不存在“跳过父类初始化”的合法路径。即使父类看似没写构造器,编译器也会为其生成一个默认无参构造器;一旦你写了任意构造器(哪怕只有一个带参的),默认无参构造器就消失。所以子类构造器总得有个明确的父类初始化入口,super() 就是这个入口的唯一语法形式。
super() 和 this() 是互斥的初始化锚点
一个构造器只能选一条初始化路径:super() 直接委托给父类,或 this() 委托给本类另一个构造器(后者内部最终也必须调用 super())。两者不能共存,是因为 JVM 只允许一次“构造器链起点”,否则会造成重复初始化或路径混乱。











