Java中this()和super()严格互斥、不可共存,必须位于构造器第一行,确保对象初始化路径唯一;若均未显式调用,编译器自动插入super()作为兜底。

在Java中,this() 和 super() 并不存在“优先级高低”之说,而是严格互斥、不可共存的两种调用方式。它们共同约束着构造器执行的起点,核心目的只有一个:确保对象初始化路径唯一、顺序可控。
构造器必须且只能选一条初始化路径
每个构造器在执行自身逻辑前,必须明确选择如何启动初始化流程:
- 调用本类其他构造器(this())→ 间接完成父类初始化
- 调用直接父类构造器(super())→ 直接完成父类初始化
二者本质是两条不同的初始化入口,不是可叠加或可排序的操作。一旦选择了 this(),后续初始化就交由被调用的那个构造器来决定是否再调用 super();若直接使用 super(),则跳过本类其他构造器,直连父类链。
this() 和 super() 必须位于第一行
这条规则不是语法偏好,而是JVM初始化机制的硬性要求:
立即学习“Java免费学习笔记(深入)”;
- 对象内存已分配但尚未初始化时,任何对成员变量、方法或父类状态的访问都可能出错
- 把 super() 放第一行,保证父类字段和构造逻辑先执行,子类才能安全依赖其结果
- 把 this() 放第一行,是为了将当前构造器“委托”给另一个构造器,避免重复初始化或状态不一致
如果编译器允许它们出现在中间,就可能出现“子类代码先跑、父类还没准备好”的危险情况,这与Java对象创建的自顶向下(Object → 父类 → 子类)原则相冲突。
隐式 super() 是默认兜底,不是替代方案
当构造器里既没写 this() 也没写 super(),编译器会自动插入 super(); —— 但这不意味着它“优先级更低”,而是语言层面的容错设计:
- 它只调用父类无参构造器,若父类没有无参构造器,编译直接失败
- 它不可被绕过:即使你写了其他语句,编译器也会强制把它移到最前(并报错)
- 它的存在恰恰反向印证了“必须有且仅有一个初始化起点”的铁律
常见错误模式与实质原因
以下写法均非法,根源都是破坏了单路径初始化原则:
- super() 和 this() 同时出现 → 可能导致父类构造器被执行两次(例如 this() 调用的构造器内部已有 super())
- this() 出现在第二行之后 → 当前构造器已开始执行局部逻辑,却突然跳转到另一套初始化流程,状态混乱
- 子类构造器未显式调用 super(…) 且父类无无参构造器 → 编译器无法插入合法的默认 super(),初始化链断裂


















