目录
- 前言
- 问题的起源:当形参“撞名”属性
- 什么是 this?
- this 的三种核心用法
- 1. 调用成员变量
- 2. 调用成员方法
- 3. 调用构造器
- 总结

前言
在 Java 编程中,我们经常会遇到一个神秘的关键字:this。对于初学者来说,它似乎无处不在,但又难以捉摸。它到底是什么?我们为什么需要它?又该在何时何地使用它呢?
本文将带你深入浅出地剖析 this 关键字,通过清晰的示例,让你彻底掌握它的三种核心用法。
问题的起源:当形参“撞名”属性
让我们从一个非常常见的场景开始。假设我们正在创建一个 Person 类,它有 name 和 age 两个属性。我们通常会为这些属性提供 set 方法,以便外部可以设置它们的值。
class Person {
String name;
int age;
// 为 age 属性设置值的方法
public void setAge(int a) {
age = a;
}
}
上面的代码工作得很好。但是,为了让参数名更具可读性,我们往往倾向于将参数名写得和属性名一样,比如这样:
class Person {
String name;
int age;
public void setAge(int age) {
// 疑似形参=形参
age = age;
}
}
现在问题来了:在 setAge 方法内部,我们希望两个都叫 age 的变量中,一个是类的属性(成员变量),另一个是方法的参数(局部变量)。当我们写 age = age; 时,Java 编译器会如何理解?
根据变量的“就近原则”,方法内的 age 会被优先解释为方法的参数。所以 age = age; 这行代码实际上变成了“把参数 age 的值赋给参数 age 自己”,这显然不是我们想要的!类的属性 age 从始至终都没有被赋值。
为了解决这种命名冲突,this 关键字闪亮登场。
什么是 this?
在 Java 中,this 是一个关键字,也是一个隐藏的引用。它指向当前对象。
简单理解:
- 当你在一个方法中调用
this时,它就代表调用这个方法的那个对象。 - 当你在一个构造器中调用
this时,它就代表正在被创建的那个对象。
现在,让我们用 this 来解决刚才的问题:
class Person {
String name;
int age;
public void setAge(int age) {
// 使用 this.age 来明确指定这是类的属性
this.age = age;
// 等号右边的 age,因为没有 this 修饰,所以是方法的形参
}
}
通过 this.age,我们清晰地告诉编译器:“嘿,我要访问的是这个对象自己的 age 属性,而不是方法的参数。” 这样,赋值就变得准确无误了。
this 的三种核心用法
this 关键字主要用于以下三个方面:
- 调用成员变量
- 调用成员方法
- 调用构造器
1. 调用成员变量
这是 this 最常见的用法,就像我们上面看到的那样。
- 特殊情况(必须使用): 当方法的形参或局部变量与类的成员变量重名时,你必须使用
this.来明确区分成员变量。这是强制性的。
public void setName(String name) {
this.name = name; // 必须使用 this
}
- 一般情况(可以选择省略): 当没有命名冲突时,
this.是可选的。编译器会自动帮你找到对象的属性。但是,为了代码的可读性,有些开发者也习惯性地加上this。
public void printAge() {
// 这两种写法效果完全一样
System.out.println("My age is: " + age);
System.out.println("My age is: " + this.age); // 加上 this 更清晰
}
2. 调用成员方法
与调用成员变量类似,你也可以使用 this 来调用当前对象的其他方法。
class Calculator {
public void add(int a, int b) {
System.out.println("Sum: " + (a + b));
}
public void calculateAndShow(int x, int y) {
System.out.println("Performing calculation...");
// 调用当前对象的 add 方法
this.add(x, y); // 这里的 this 同样可以省略
}
}
在 calculateAndShow 方法中,this.add(x, y) 和 add(x, y) 是等价的。this 再次强调了“我正在调用我自己(这个对象)的另一个方法”。
3. 调用构造器
这是 this 一个非常强大且特殊的功能。当你的类有多个重载的构造器时,你可以在一个构造器中使用 this(形参) 来调用另一个构造器,从而避免代码重复。
让我们还是以 Person 类为例。假设我们希望提供三种创建 Person 对象的方式:
- 不提供任何信息。
- 只提供姓名。
- 提供姓名和年龄。
class Person {
String name;
int age;
// 1. 默认构造器
public Person() {
System.out.println("一个新的 Person 对象被创建了!");
}
// 2. 只提供姓名的构造器
public Person(String name) {
this(); // 调用上面的默认构造器
this.name = name;
}
// 3. 提供姓名和年龄的构造器
public Person(String name, int age) {
this(name); // 调用只提供姓名的构造器
this.age = age;
}
}
在上面的例子中:
Person(String name, int age)构造器通过this(name)调用了Person(String name)构造器。Person(String name)构造器又通过this()调用了Person()默认构造器。
这样就形成了一个“构造器调用链”,极大地简化了代码,提高了复用性。
使用 this(...) 调用构造器时,必须遵守以下规则:
- 格式固定: 必须是
this(参数列表)的形式。 - 必须在首行:
this(...)的调用语句必须是构造器内的第一行代码。 - 数量限制: 一个构造器中最多只能调用一个
this(...)。因为它必须在首行,所以不可能有两个。
总结
this 关键字是 Java 面向对象编程中的一个基础且重要的概念。它始终指向当前对象,为我们解决了变量命名冲突的问题,并提供了一种在构造器之间相互调用的优雅方式。
记住这几点:
- 核心定义:
this代表当前对象实例。 - 区分变量: 当局部变量与成员变量同名时,
this.变量指的是成员变量。 - 调用方法:
this.方法()调用当前对象的其他方法,this通常可省略。 - 链式构造:
this(参数)在构造器中调用另一个重载的构造器,但必须放在第一行。
希望通过这篇博文,你对 this 关键字有了更深刻的理解。在你的编码实践中,请大胆地使用它吧!
2025.10.13 西直门