java中构造方法通过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) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be null or empty");
}
this.name = name.trim();
this.age = Math.max(0, age); // 确保 age 非负
}
// 复用主构造:指定默认年龄
public Person(String name) {
this(name, 0); // ← 关键:复用上面的校验和赋值逻辑
}
// 复用主构造:指定默认姓名和年龄
public Person() {
this("Anonymous", 0); // ← 所有初始化逻辑仍在一处
}
}
这样所有参数校验、空值处理、默认值设定都集中在 Person(String, int) 中,后续新增构造方法也只需一行 this(...) 即可接入统一逻辑。
注意 this() 和字段直接赋值的区别
不用 this() 时,容易写出重复代码:
// ❌ 冗余写法:三处重复校验和赋值
public Person(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be null or empty");
}
this.name = name.trim();
this.age = 0;
}
public Person() {
this.name = "Anonymous";
this.age = 0;
}
一旦校验规则变更(比如要求姓名至少2个字符),就得改多处——容易遗漏。而用 this() 后,只改一处主构造即可生效全局。
结合 builder 模式时仍可使用 this()
即使类提供 Builder,基础构造方法之间依然推荐用 this() 统一初始化。Builder 最终调用的仍是某个构造方法,因此底层健壮性仍依赖构造链的设计。
不复杂但容易忽略:只要存在多个构造方法且有交叠逻辑,就值得考虑用 this() 提炼主入口。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











