this()用于同类构造器间调用,实现初始化逻辑复用;必须首行调用、不可与super()共存、禁止循环调用;典型用法是参数降维委派,默认值补全;进阶可预处理参数再委派;需避免链过长影响可读性。

this() 是 Java 中用于在同一个类的不同构造器之间调用的语法,它的核心作用是**复用初始化逻辑、避免代码重复、统一参数处理路径**。它必须作为构造器的第一条语句出现,且只能调用本类的其他构造器(不能和 super() 同时存在)。
基本规则和限制
使用 this() 时需严格遵守以下几点:
- 必须放在构造器的第一行,否则编译报错
- 一个构造器中最多只能有一条
this()调用 - 不能在静态上下文(如静态方法、静态块)中使用
- 不能形成调用循环,比如 A 调 B,B 又调 A —— 编译器会检测并拒绝
典型用法:参数降维与默认值委派
最常见场景是用“全参构造器”作为最终入口,其余构造器通过 this() 把缺失的参数补上默认值后转交过去:
public class Person {
private String name;
private int age;
private String city;
// 全参构造器(真正干活的)
public Person(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city != null ? city : "Unknown";
}
// 只传 name → 补默认 age 和 city
public Person(String name) {
this(name, 0, null); // 委派给全参构造器
}
// 传 name 和 age → 补默认 city
public Person(String name, int age) {
this(name, age, null); // 同样委派
}
}
进阶技巧:参数预处理后再委派
如果某些参数需要校验或标准化(比如 trim 字符串、修正负数年龄),建议在调用 this() 前完成处理,而不是塞进目标构造器里判断:
- 把校验/转换逻辑放在调用方构造器中,保持全参构造器干净专注赋值
- 避免在多个构造器里重复写相同的 if-check 或 format 逻辑
- 例如:
new Person(" Alice ", -5)应自动变成Person("Alice", 0, null)
注意事项:不要滥用,警惕可读性下降
当构造器链过长(比如 A → B → C → D),或参数映射关系不直观时,阅读代码的人容易迷失实际初始化路径:
- 优先保证调用链短(通常 2 层以内最清晰)
- 构造器参数命名尽量一致,便于追踪数据流向
- 必要时加简短注释说明“此构造器等价于 new X(a, b, DEFAULT_C)”











