代码复用 和 保证构造逻辑的一致性。

核心用途:构造方法间的调用
当你在一个类的构造方法中,需要调用同一个类的另一个构造方法时,就必须使用 this()。
语法规则:
- 必须是第一条语句:
this()调用必须是构造方法中的第一条可执行语句,这确保了在访问任何实例字段之前,对象已经被另一个构造方法正确初始化。 - 不能同时使用
this()和super():因为它们都必须是第一条语句,所以一个构造方法中不能同时出现this(...)和super(...)。 - 用于构造链:可以形成一条构造方法的调用链,最终通常会调用一个不调用任何其他构造方法的“基础”构造方法(通常是无参构造方法,或者一个参数最全的构造方法)。
为什么需要使用 this()?(解决了什么问题)
假设我们不使用 this(),而是通过复制粘贴代码来实现构造方法,这会带来几个问题:
- 代码冗余:多个构造方法包含重复的初始化代码。
- 维护困难:如果需要修改初始化逻辑,就必须在所有构造方法中逐一修改,很容易遗漏或出错。
- 逻辑不一致:很难保证所有构造方法都遵循完全相同的初始化路径。
this() 完美地解决了这些问题。

代码示例
让我们通过一个经典的 Student 类来理解。
场景:不使用 this() (不推荐)
public class Student {
private String name;
private int age;
private String school; // 假设所有学生都来自同一所学校
// 构造方法1:只提供姓名和年龄
public Student(String name, int age) {
this.name = name;
this.age = age;
this.school = "清华大学"; // 重复代码
}
// 构造方法2:只提供姓名
public Student(String name) {
this.name = name; // 重复代码
this.age = 18; // 默认年龄
this.school = "清华大学"; // 重复代码
}
// 构造方法3:无参构造
public Student() {
this.name = "Unknown"; // 重复代码
this.age = 18; // 重复代码
this.school = "清华大学"; // 重复代码
}
// ... 其他方法
}
上面的代码中,school 字段的初始化逻辑被重复了三次,如果学校名称变了,我们需要修改三个地方。
场景:使用 this() (推荐)
我们可以设计一个“主”构造方法,它接收所有必要的参数,然后让其他构造方法通过 this() 来调用它。
public class Student {
private String name;
private int age;
private String school = "清华大学"; // 提供一个默认值
// 【主构造方法】 - 参数最全,负责所有初始化逻辑
public Student(String name, int age) {
this.name = name;
this.age = age;
// school 已经有默认值了,这里可以省略
System.out.println("调用主构造方法: " + name + ", " + age);
}
// 构造方法2:只提供姓名,年龄使用默认值 18
// 它通过 this() 调用主构造方法
public Student(String name) {
// 将 age 的默认值 18 传递给主构造方法
this(name, 18);
System.out.println("调用单参构造方法: " + name);
}
// 构造方法3:无参构造
// 它通过 this() 调用单参构造方法
public Student() {
// 将默认姓名 "Unknown" 传递给单参构造方法
this("Unknown");
System.out.println("调用无参构造方法");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school='" + school + '\'' +
'}';
}
public static void main(String[] args) {
System.out.println("--- 创建 s1 (使用主构造方法) ---");
Student s1 = new Student("张三", 20);
System.out.println(s1);
System.out.println("\n--- 创建 s2 (使用单参构造方法) ---");
Student s2 = new Student("李四");
System.out.println(s2);
System.out.println("\n--- 创建 s3 (使用无参构造方法) ---");
Student s3 = new Student();
System.out.println(s3);
}
}
执行结果:

--- 创建 s1 (使用主构造方法) ---
调用主构造方法: 张三, 20
Student{name='张三', age=20, school='清华大学'}
--- 创建 s2 (使用单参构造方法) ---
调用主构造方法: 李四, 18
调用单参构造方法: 李四
Student{name='李四', age=18, school='清华大学'}
--- 创建 s3 (使用无参构造方法) ---
调用主构造方法: Unknown, 18
调用单参构造方法: Unknown
调用无参构造方法
Student{name='Unknown', age=18, school='清华大学'}
分析:
new Student("张三", 20):直接调用主构造方法,完成初始化。new Student("李四"):调用单参构造方法,单参构造方法的第一条语句this("李四", 18);将任务委托给了主构造方法,并提供了默认的年龄18,主构造方法负责真正的初始化。new Student():调用无参构造方法,无参构造方法的第一条语句this("Unknown");将任务委托给了单参构造方法,并提供了默认的姓名"Unknown",单参构造方法再通过this()委托给主构造方法。
这样,所有复杂的初始化逻辑都集中在主构造方法中,其他构造方法只是提供了不同的默认值入口,代码变得清晰、简洁且易于维护。
this() 与 this 的区别
这是一个常见的混淆点,需要明确区分:
| 特性 | this() |
this |
|---|---|---|
| 含义 | 调用构造方法 | 指代当前对象的引用 |
| 用途 | 在一个构造方法中调用另一个构造方法 | 区分成员变量和局部变量(同名的参数) 将当前对象作为参数传递给其他方法 在返回当前对象的方法中返回 this |
| 语法 | this(参数列表); |
this.成员变量 或 this.成员方法() |
| 位置 | 只能出现在构造方法的第一行 | 可以出现在任何实例方法中 |
示例:this 的用法
public class Person {
private String name;
public Person(String name) {
// 使用 this.name 来区分成员变量 name 和 参数 name
this.name = name;
}
public Person introduce() {
System.out.println("你好,我叫 " + this.name);
// 返回当前对象,可以链式调用
return this;
}
public static void main(String[] args) {
Person p = new Person("王五");
p.introduce();
// 链式调用
p.introduce().introduce();
}
}
什么时候用 this()?
当你在一个类的构造方法中,需要复用另一个构造方法的初始化逻辑时,就使用 this()。
最佳实践:
- 定义一个“主”构造方法:通常是参数最全的那个,它包含所有核心的初始化代码。
- 其他构造方法调用主构造方法:使用
this(...)并提供必要的默认值或参数,将初始化工作委托给主构造方法。 - 保持构造链清晰:确保
this()的调用路径清晰易懂,避免复杂的嵌套。
这样做可以极大地提高代码的可读性、可维护性和健壮性。
