Java中this()是编译器强制管控的初始化跳转机制,必须位于构造器首行、不可与super()共存、参数须严格匹配、调用链最终必须抵达父类构造器,否则编译失败。

Java 中用 this() 调用本类其他构造器,不是普通方法调用,而是编译器强制管控的初始化跳转机制,违反任一规则都会直接编译失败。
必须是构造器的第一条可执行语句
哪怕前面只有一行变量声明、System.out.println 或 if 判断,都会报错:Constructor call must be the first statement。因为 JVM 需在任何字段操作前就确定初始化路径,不能“先做点别的再跳”。
- ✅ 正确:
public Person(String name) { this(name, 0); } - ❌ 错误:
public Person(String name) { String tmp = ""; this(name, 0); }
同一构造器中只能出现一次
重复写 this() 或混用 this("a") 和 this(1),编译器会拒绝——初始化逻辑必须单向明确,不支持“调完一个再根据结果选另一个”。
- ✅ 允许:
this("default"); - ❌ 不允许:
this("a"); this(42);或this(); this("x");
不能与 super() 共存
this() 和 super() 都要抢占首行位置,二者天然互斥。用了 this(),编译器就不会自动补 super();但整个调用链最终必须抵达父类构造器,否则编译失败。
立即学习“Java免费学习笔记(深入)”;
- ✅ 安全链路:
Person() → this("N/A") → this("N/A", 0) → super() - ❌ 编译错误:
this("a"); super(); - ⚠️ 隐患:若被调用的终点构造器没写
super(),且父类无无参构造器,也会编译失败
参数必须严格匹配目标构造器签名
实参类型、数量、顺序必须与某个已声明构造器完全一致。Java 不在此处做自动装箱/拆箱、字符串转数字、varargs 展开或隐式对象转型。
- ✅ 匹配:
this(5)→Person(int age) - ✅ 匹配:
this(5L)→Person(long age) - ❌ 不匹配:
this(5)→Person(Integer age)(int≠Integer) - ❌ 不匹配:
this("a", "b")→Person(String... names)(varargs 不参与重载解析)


















