this() 是 Java 中调用本类其他构造器的关键字,必须位于构造器首行且仅能出现一次,用于复用初始化逻辑并确保对象只被初始化一次。

在 Java 构造器中,用 this 调用本类其他构造器(即构造器链),是一种常见且实用的重用写法,能避免重复初始化逻辑。关键在于:它必须是构造器的第一条语句,且只能调用一次。
什么是 this() 构造器调用
this(...) 是对当前类另一个构造器的显式调用,属于构造器重载的协作机制。它不是普通方法调用,而是编译器强制要求的构造流程跳转,目的是复用已有初始化逻辑。
- 只能出现在构造器第一行,否则编译报错
- 不能和
super(...)同时出现(二者都需首行) - 参数类型和数量必须匹配目标构造器签名
- 本质是让对象只被初始化一次,但走不同路径
典型使用场景:参数简化与默认值封装
当多个构造器存在公共初始化步骤(如字段赋值、校验、资源预分配),可把核心逻辑集中到一个“主构造器”,其余构造器通过 this(...) 委托过去。
例如:
立即学习“Java免费学习笔记(深入)”;
public class User {
private String name;
private int age;
private String email;
// 主构造器(含完整参数)
public User(String name, int age, String email) {
if (name == null || name.trim().isEmpty())
throw new IllegalArgumentException("Name required");
this.name = name.trim();
this.age = Math.max(0, age);
this.email = email != null ? email.toLowerCase() : null;
}
// 简化版:提供默认邮箱
public User(String name, int age) {
this(name, age, "user@example.com"); // 复用主构造逻辑
}
// 最简版:仅姓名,其余设默认
public User(String name) {
this(name, 18); // 再委托给上一个构造器
}
}
注意事项与常见误区
看似简单,但容易因顺序或语义理解出错:
-
this(...)调用的是构造器,不是普通方法,不返回值,也不参与表达式计算 - 不能在静态上下文、普通方法或字段初始化器中使用
this(...) - 循环调用(A → B → A)会导致编译失败
- 若未显式写
this(...)或super(...),编译器自动插入无参super();一旦写了this(...),就不再自动补super()
替代方案对比:为什么不用 setter 或静态工厂
有人会想:为何不写个私有初始化方法,再在各构造器里调用?
- setter 方式无法保证 final 字段赋值(final 字段只能在构造器内直接赋值或通过
this(...)间接赋值) - 普通私有方法无法访问正在构造的对象的
this引用(编译期限制),尤其涉及this逃逸时更危险 - 静态工厂方法灵活,但失去 new 的语义直观性,且无法直接支持
final字段的强制初始化约束


















