Java中this()调用本类构造器是编译器强制管控的初始化跳转,必须为首条语句、仅出现一次、不可与super()共存、实参严格匹配签名、调用链须有终点。

Java 中使用 this() 调用本类其他构造器,不是普通方法调用,而是编译器强制管控的初始化路径跳转。它必须严格满足几条硬性语法要求,否则直接编译失败。
必须是构造器的第一条可执行语句
这一条没有例外。this() 前不能有任何变量声明、赋值、日志输出、if 判断,甚至一个空的 System.out.println() 都会导致报错 “call to this must be first statement”。
- ✅ 正确:
public Person(String name) { this(name, 0); } - ❌ 错误:
public Person(String name) { String tmp = ""; this(name, 0); } - ❌ 错误:
public Person(String name) { if (name == null) throw ...; this(name, 0); }
同一构造器中只能出现一次,且不可与 super() 共存
this() 和 super() 都争抢“首行位置”,语法上天然互斥。选了 this(),就不能再写 super();反之亦然。
- ✅ 合法:无参构造器调
this("default"),终点构造器里显式写super()或依赖隐式无参父构 - ❌ 编译失败:
this("a"); super();或this(); this(123); - ⚠️ 注意:用了 this() 后,编译器不会自动补 super();若父类没有无参构造器,被 this() 最终调到的那个构造器里,必须自己写 super(...)
实参必须严格匹配目标构造器签名
重载解析发生在编译期,this() 不做任何隐式转换。类型、数量、顺序必须完全一致,仅允许标准类型提升(如 byte → int),不支持自动装箱/拆箱、字符串转数字、varargs 展开等。
立即学习“Java免费学习笔记(深入)”;
- ✅ 匹配:
this(5)→Person(int age) - ✅ 匹配:
this(5L)→Person(long age) - ❌ 不匹配:
this(5)→Person(Integer age)(int ≠ Integer) - ❌ 不匹配:
this("a", "b")→Person(String... names)(varargs 不参与重载匹配)
调用链必须有明确终点,禁止循环
所有 this() 调用最终必须抵达一个不再调用 this() 的构造器——也就是“终点构造器”。它通常负责字段赋值、校验、调用 super() 等核心初始化工作。
- ✅ 正确链:
Person()→this("N/A")→this("N/A", -1),终点是Person(String, int) - ❌ 编译报错:
Person()调this("x"),而Person(String)又调回this(),触发 “Recursive constructor invocation” - ? 推荐:把参数最全、含校验和 super() 的构造器设为终点,其他构造器只做参数简化转发


















