this 是 Java 中的一个保留关键字,它是一个指向当前对象的引用,你可以把它理解为“当前这个对象”的代名词,它的主要用途是在类内部,让你能够明确地引用当前对象的成员(变量和方法)。

this 的核心用途可以归结为以下三大类:
解决成员变量与局部变量的命名冲突
这是 this 最常见、最重要的用法,当方法的参数名与类的成员变量名相同时,Java 编译器会默认使用参数名,如果你想在这个方法内部访问或操作类的成员变量,就必须使用 this 关键字来明确指定。
示例:
public class Person {
private String name; // 成员变量
// 构造方法,参数名也是 name
public Person(String name) {
// 这里的 name 指的是构造方法的参数 name
// 如果我们不使用 this,name = name; 就没有任何意义,相当于自己给自己赋值。
// 使用 this.name 表示给当前对象的成员变量 name 赋值
this.name = name;
}
public void printName() {
System.out.println("Name: " + this.name); // 这里使用 this 可以省略,但加上更清晰
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice");
person.printName(); // 输出: Name: Alice
}
}
分析:
在 Person(String name) 构造方法中:

name(没有this的)指的是方法的参数。this.name指的是当前创建的这个Person对象的成员变量。
通过 this.name = name;,我们将传入的参数 name 的值赋给了当前对象的成员变量 name。
在构造方法中调用其他构造方法
在一个类中,你可以使用 this(...) 的形式来调用同一个类中的其他构造方法,这通常被称为构造方法重载,这样做可以避免重复的代码,使构造逻辑更清晰。
重要规则:
this(...)必须是构造方法中的第一条语句。- 你不能在一个构造方法中同时调用
super(...)和this(...),因为它们都必须是第一条语句。
示例:

public class Student {
private String name;
private int age;
private String major;
// 构造方法1:只提供姓名
public Student(String name) {
this(name, 18); // 调用构造方法2,并设置默认年龄为18
System.out.println("构造方法1被调用");
}
// 构造方法2:提供姓名和年龄
public Student(String name, int age) {
this(name, age, "未定专业"); // 调用构造方法3,并设置默认专业
System.out.println("构造方法2被调用");
}
// 构造方法3:提供所有信息
public Student(String name, int age, String major) {
this.name = name;
this.age = age;
this.major = major;
System.out.println("构造方法3被调用");
}
public void displayInfo() {
System.out.println("姓名: " + name + ", 年龄: " + age + ", 专业: " + major);
}
}
public class Main {
public static void main(String[] args) {
System.out.println("--- 创建学生1 ---");
Student student1 = new Student("Bob");
student1.displayInfo();
// 输出:
// --- 创建学生1 ---
// 构造方法3被调用
// 构造方法2被调用
// 构造方法1被调用
// 姓名: Bob, 年龄: 18, 专业: 未定专业
System.out.println("\n--- 创建学生2 ---");
Student student2 = new Student("Charlie", 20, "计算机科学");
student2.displayInfo();
// 输出:
// --- 创建学生2 ---
// 构造方法3被调用
// 姓名: Charlie, 年龄: 20, 专业: 计算机科学
}
}
分析:
当你调用 new Student("Bob") 时:
- 首先执行
Student(String name)构造方法。 - 它的第一条语句是
this(name, 18);,于是调用了Student(String name, int age)构造方法。 Student(String name, int age)的第一条语句是this(name, age, "未定专业");,于是调用了Student(String name, int age, String major)构造方法。- 所有信息被设置,然后执行
System.out.println的顺序是逆的,因为构造方法调用是层层深入的。
将当前对象作为参数传递给其他方法
当一个方法需要接收一个它所属类的对象作为参数时,可以使用 this 来传递当前对象本身。
示例:
public class Car {
private String model;
public Car(String model) {
this.model = model;
}
// 这个方法需要另一个 Car 对象进行比较
public void compareWith(Car otherCar) {
if (this.model.equals(otherCar.model)) {
System.out.println("这两辆车是同一型号: " + this.model);
} else {
System.out.println("这两辆车型号不同。");
}
}
// 将当前对象作为参数传递
public void selfCompare() {
System.out.println("当前车型: " + this.model);
System.out.println("正在将当前车辆对象进行比较...");
compareWith(this); // 将当前对象 this 传递给 compareWith 方法
}
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car("Toyota Camry");
Car car2 = new Car("Honda Civic");
car1.compareWith(car2); // 比较两辆不同的车
System.out.println("--------------------");
car1.selfCompare(); // 将自己和自己比较
}
}
输出:
这两辆车型号不同。
--------------------
当前车型: Toyota Camry
正在将当前车辆对象进行比较...
这两辆车是同一型号: Toyota Camry
作为返回值返回当前对象
你可以让方法返回 this,这在方法链(Method Chaining)中非常有用,通过返回当前对象,你可以在一行代码中连续调用多个方法。
示例:
public class Builder {
private String name;
private int age;
private String city;
public Builder setName(String name) {
this.name = name;
return this; // 返回当前 Builder 对象
}
public Builder setAge(int age) {
this.age = age;
return this; // 返回当前 Builder 对象
}
public Builder setCity(String city) {
this.city = city;
return this; // 返回当前 Builder 对象
}
public void build() {
System.out.println("创建了一个对象: " + this.name + ", " + this.age + "岁, 来自 " + this.city);
}
}
public class Main {
public static void main(String[] args) {
// 使用方法链,代码更简洁
new Builder()
.setName("David")
.setAge(30)
.setCity("北京")
.build();
// 等同于下面不使用链式调用的写法
Builder b = new Builder();
b.setName("David");
b.setAge(30);
b.setCity("北京");
b.build();
}
}
输出:
创建了一个对象: David, 30岁, 来自 北京
总结表格
| 用法 | 描述 | 示例 |
|---|---|---|
| 区分成员变量和局部变量 | 当方法参数与成员变量同名时,用 this 指代成员变量。 |
this.name = name; |
| 调用其他构造方法 | 在一个构造方法中调用同一个类的另一个构造方法。 | this(name, 18); (必须是第一条语句) |
| 传递当前对象 | 将当前对象作为参数传递给其他方法。 | someMethod(this); |
| 返回当前对象 | 返回当前对象以支持方法链(Method Chaining)。 | return this; |
this 和 super 的区别
this 和 super 是两个容易混淆的概念,简单对比如下:
| 特性 | this |
super |
|---|---|---|
| 指向 | 指向当前对象的引用。 | 指向当前对象的父类对象的引用。 |
| 用途 | 访问当前对象的成员。 调用当前对象的构造方法。 |
访问父类的成员(变量/方法)。 调用父类的构造方法。 |
| 调用构造方法 | this(...) |
super(...) |
| 在构造方法中的位置 | 必须是第一条语句。 | 必须是第一条语句。 |
希望这个详细的解释能帮助你完全理解 this 在 Java 中的用法!
