this()用于在构造函数中调用本类其他构造函数,必须位于首行、不可与super()共存,且不能递归调用;常用于参数重载时复用核心初始化逻辑。

在Java中,this()关键字可用于在一个构造函数中调用本类的其他构造函数,从而避免重复代码,提升可维护性。这种调用必须是构造函数的第一条语句,且不能与super()共存。
调用本类构造函数的基本规则
使用this(参数)调用本类其他构造函数时,需满足以下条件:
- 必须放在构造函数的第一行
- 只能调用本类的其他构造函数,不能递归调用自身
- 不能同时出现
this()和super() - 若未显式调用
this()或super(),编译器会自动插入无参super()
典型复用场景:参数较多时的简化构造
当一个类有多个构造函数,且部分逻辑(如字段赋值、校验)高度重合时,可将核心初始化逻辑集中到一个“主构造函数”中,其余构造函数通过this()委托给它。
例如:
class Person {private String name;
private int age;
private String id;
// 主构造函数,承担核心初始化
public Person(String name, int age, String id) {
this.name = name != null ? name.trim() : "";
this.age = Math.max(0, age);
this.id = id == null ? "UNKNOWN" : id;
}
// 复用主构造:只提供姓名和年龄
public Person(String name, int age) {
this(name, age, null); // 调用三参数构造
}
// 复用主构造:只提供姓名
public Person(String name) {
this(name, 0, null); // 调用三参数构造
}
}
注意事项与常见错误
实际使用中容易忽略的关键点:
-
this()不是方法调用,而是构造函数链的启动指令,语法上必须带括号(即使无参也要写this()) - 若主构造函数包含复杂逻辑(如I/O或抛异常),所有委托构造都会执行它,需确保副作用可控
- IDE通常能提示构造函数链是否形成闭环,但手动编码时务必检查调用路径是否终止于某个不调用
this()的构造函数
与super()的区别与取舍
两者都必须位于第一行,因此只能二选一:
- 想复用本类其他构造逻辑 → 用
this() - 想显式调用父类构造函数 → 用
super() - 若需既复用本类构造又指定父类初始化,应把公共逻辑提取到普通方法中,再由各构造函数分别调用(
this()和super()不可共存)











