this()必须位于构造方法第一行且仅出现一次,不可与super()共存,参数需匹配且避免循环调用,初始化前禁止访问实例成员。

在Java中,this() 可以在构造方法的第一行调用本类的其他构造方法(即“相邻构造”),但必须严格满足语法和语义约束,否则编译失败或逻辑出错。
必须放在第一行且只能出现一次
调用 this(...) 的语句必须是构造方法体内的首条可执行语句,且整个构造方法中最多只能有一个 this() 调用。
- 若写在第二行、被 if 包裹、或前面有变量声明/打印语句,编译器直接报错:"call to this must be first statement in constructor"
- 不能同时写 this(...) 和 super(...) —— 二者互斥,因为都必须是第一行
参数必须匹配且不能形成循环调用
this(...) 的实参列表需能唯一匹配本类中某个构造方法的形参签名;同时所有构造方法之间不能构成调用环。
- 例如:
A() { this(1); }和A(int x) { this(); }会触发编译错误:"recursive constructor invocation" - 推荐设计为单向链式调用:全参构造 ← 部分参数构造 ← 无参构造,避免歧义和维护风险
不能访问实例成员或使用this引用未初始化的部分
由于 this() 执行时对象尚未完成初始化,此时访问 this.field、调用 this.method() 或读取未赋值字段会导致不可靠行为(尤其涉及继承时)。
- 允许的操作仅限:传参、字面量计算、静态方法调用、常量表达式
- 禁止操作示例:
this.name = "x";、System.out.println(this.id);、this.init();
典型安全写法示例
以下是一个符合所有规则的构造链设计:
public class Person {
private String name;
private int age;
public Person() {
this("Unknown", 0); // ✅ 安全:第一行,调用相邻构造
}
public Person(String name) {
this(name, 18); // ✅ 安全:第一行,向下传递默认年龄
}
public Person(String name, int age) {
this.name = name; // ✅ 此处才开始真正初始化
this.age = age;
}
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











