Java中this()和super()不能共存于同一构造方法,因构造器调用必须是首句且唯一;二者共存会导致初始化顺序混乱和重复调用风险。

在 Java 中,this() 和 super() 确实不能同时出现在同一个构造方法中,根本原因在于:**每个构造方法只能有一条显式的构造器调用语句,且必须是第一行代码**。
为什么只能有一个构造器调用?
Java 规定,如果构造方法中需要调用其他构造器(本类的或父类的),该调用必须是方法体中的第一条可执行语句。这是因为:
- 对象初始化必须有明确、唯一的起点——要么委托给本类其他构造器(
this()),要么直接开始父类初始化(super()); - 若允许两者共存,就会出现“先调 this → this 内部又调 super → 当前方法再调 super”的重复初始化风险,破坏对象创建的单链顺序;
- JVM 在实例化时需严格按继承链自顶向下(Object → 父类 → 子类)逐层构造,
super()是启动这一链条的入口,而this()只是同一类内构造逻辑的跳转,二者语义冲突。
常见错误写法与编译提示
以下代码无法通过编译:
public class Child extends Parent {
public Child() {
this("default"); // ✅ 第一行:调本类构造器
super(123); // ❌ 错误:第二行不能再调 super()
}
public Child(String s) {
super(456); // ✅ 第一行:调父类构造器
this(); // ❌ 错误:第二行不能再调 this()
}
}
编译器会报错:call to this/super must be first statement in constructor,强调“必须是首句”,也隐含了“只能有一个”。
立即学习“Java免费学习笔记(深入)”;
如何合理组织多构造器场景?
当需要复用逻辑又涉及父类初始化时,推荐以下做法:
-
优先用 this() 委托,把 super() 集中到一个“主构造器”中:让所有
this()最终都落到那个含super()的构造器上; - 避免在多个构造器里重复写 super(),既减少冗余,也防止参数不一致导致父类状态异常;
- 如果父类没有无参构造器,子类所有构造器都必须显式调用
super(...)或通过this()间接调用它——否则编译失败。
特殊情况:默认的 super() 调用
如果构造器第一行既没写 this(...) 也没写 super(...),编译器会自动插入 super()(无参)。此时你不能再手动写 this(...),否则等于试图在同一方法中既触发隐式 super() 又显式调用 this(),同样违反规则。


















