Java中this()是构造器首行硬性跳转指令,必须为第一条可执行语句,不可与super()共存,参数需严格匹配签名,调用链须终止于不调用this()的终点构造器。

Java 中构造函数里写 this() 不是“调用方法”,而是告诉编译器:“别执行我这的逻辑,立刻跳去另一个构造器”。它是一条硬性跳转指令,违反任一规则都会直接编译失败,不给运行机会。
必须是构造器中第一条可执行语句
前面不能有任何东西——不能有变量声明、赋值、日志打印、if 判断,甚至空行后的注释也不影响语法,但只要有一行可执行代码(比如 int x = 1; 或 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() 都要抢占“第一行”的位置,二者天然互斥。编译器只允许你选一条初始化起点:要么委托本类其他构造器,要么直连父类。
- ✅ 安全链路:
Person() → this("N/A") → this("N/A", 0) → super()(终点含显式或隐式super()) - ❌ 直接报错:
this("A"); super(); - ⚠️ 隐患:用了
this()后,编译器不会自动补super();如果被调用的终点构造器没写super(),且父类没有无参构造器,就会编译失败
参数必须严格匹配目标构造器签名
重载解析在编译期完成,this() 不参与运行时类型转换。不支持自动装箱/拆箱、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() 调用最终必须落到一个**不再调用 this() 的构造器**上,这个终点构造器负责字段赋值、校验、调用 super() 等核心工作。
- ✅ 正确:
Person() → this("Anonymous") → this("Anonymous", -1)(终点是双参构造器) - ❌ 报错:
Person() → this("A"),而Person(String)又调回Person()(编译提示 “Recursive constructor invocation”) - ? 建议:把参数最全、含校验和
super()的构造器设为终点,其余构造器仅做参数降维转发


















