this()是当前类中其他构造函数的显式调用,必须位于第一行且仅一次,不创建新对象而跳转初始化流程,所有构造器最终委托给参数最全的主构造器实现逻辑复用与参数默认化。

Java中用this()调用构造函数,本质是复用已有逻辑、避免重复代码,同时实现参数的“默认化”——不是靠编译器自动填充,而是由开发者显式定义哪些参数取什么默认值。
理解this()调用的本质
this()是当前类中其他构造函数的显式调用,必须放在第一行,且只能出现一次。它不创建新对象,只是把初始化流程跳转到另一个构造器执行。
- 它不是重载的“自动匹配”,而是你手动指定走哪条初始化路径
- 被调用的构造器负责实际赋值,
this()那一行本身不设置任何字段值 - 所有构造器最终都要指向一个“主构造器”(通常参数最多、逻辑最全),其他构造器通过
this()委托给它
用this()实现参数默认化的标准写法
以Person类为例:希望姓名必填,年龄和城市可选,默认年龄为0、城市为"未知"。
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;
}
// 默认城市 → 委托给主构造器,传入"未知"
public Person(String name, int age) {
this(name, age, "未知");
}
// 默认年龄和城市 → 委托给上一个,或直接到主构造器
public Person(String name) {
this(name, 0, "未知"); // 或 this(name, 0)
}
}
这样调用new Person("张三")时,实际执行的是三参数构造器,字段已按预期初始化。
立即学习“Java免费学习笔记(深入)”;
常见陷阱与注意事项
-
this()必须是构造器内第一句,前面不能有任何变量声明、打印或判断 - 不能在
this()调用后访问this的字段——因为对象尚未完成初始化 - 避免循环调用:A调B,B又调A,编译会报错
- 静态方法、普通方法里不能用
this();它只属于构造器上下文
什么时候该用this(),而不是设默认值在方法里?
当多个构造签名语义清晰、用户使用场景明确时,this()更直观安全。
- 适合:构建器模式简化版、POJO类、配置类(如
HttpClientBuilder风格) - 不适合:参数间有复杂校验依赖(比如“如果传了end time,start time必须非空”),这种应统一收口到单个构造器+参数检查
- 替代方案:静态工厂方法(如
Person.ofName("李四"))更灵活,但失去new的直觉性


















