Java构造函数重载中,可用this()调用同一类其他构造函数,将公共初始化逻辑集中到参数最全的主构造函数中,且this()必须位于第一行、不可与super()共存、避免循环调用。

Java 中构造函数重载时,可以用 this() 调用同一类中的其他构造函数,把公共初始化逻辑集中到一个“主构造函数”里,避免字段重复赋值、逻辑复制。
用 this() 委托给参数最全的构造函数
通常把字段最多、最完整的构造函数作为主入口,其他构造函数通过 this(...) 把参数补全后委托给它。这样所有初始化都只写一次。
- 必须是构造函数第一行语句,否则编译报错
- 不能和 super() 同时出现(只能选其一)
- 避免循环调用:比如 A 调 B,B 又调 A,编译会拒绝
常见模式:默认值由主构造函数统一处理
比如定义一个 Person 类,支持无参、只传姓名、传姓名和年龄三种方式:
public class Person {
private String name;
private int age;
// 主构造函数(含全部逻辑)
public Person(String name, int age) {
this.name = name != null ? name.trim() : "未知";
this.age = Math.max(0, age); // 确保年龄非负
}
// 委托:只传姓名 → 补默认年龄
public Person(String name) {
this(name, 0); // 复用主逻辑,不重复写 name 处理
}
// 委托:无参 → 补默认姓名和年龄
public Person() {
this("匿名", 0); // 所有校验和赋值仍走主构造函数
}
}
注意 this() 不是普通方法调用,而是构造链起点
this() 的作用是启动构造流程,不是执行完再继续当前构造体。所以它后面的代码不会在委托目标执行前运行——所有初始化必须放在被委托的构造函数里。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
this(name); System.out.println("这行不会执行"); - 正确做法:把日志、校验、赋值等都放进被调用的构造函数
- 如果需要额外操作(如注册监听),放在 this() 之后、但必须确保字段已初始化完成
配合 final 字段和不可变设计更安全
当类有 final 字段时,this() 委托能确保它们只被赋值一次,且都在构造链中明确初始化,避免遗漏或重复赋值问题。
- final 字段必须在每个构造函数中显式赋值,或通过 this() 委托保证被赋值
- 没有 this() 时,每个构造函数都要单独写一遍 final 字段赋值,容易出错
- 委托后,只需在主构造函数里赋一次,清晰又安全


















