在 Java 中,不仅仅允许定义成员变量,也可以在方法(包含构造方法)、代码块中定义局部变量(包括方法的参数)。如果我们定义的局部变量和成员变量出现命名冲突怎么办呢?如下面代码:
class User {
private int id;
private String name;
public User(int id, String name) {
id = id;
name = name;
}
// ...
}上面代码中,User 类的构造函数中定义了局部变量 id 和 name,此时两者的名字和 User 类的成员变量冲突了。为了解决该问题,我们首先想到的是修改构造方法参数的参数名。但是,这种解决办法不是很优雅。于是,Java 引入了关键字 this 来解决这个问题。
this 关键字用来表明方法所属的当前对象,可以分为两种情况:
在普通方法中,关键字 this 代表方法的调用者,即本次调用了该方法的对象。例如:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void showDate() {
System.out.println(this.dateFormat.format(new Date()));
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.showDate();
}
}运行示例,输出结果如下:
2022-09-04 15:20:30
上面代码中,showDate() 方法中的 this 表示 demo 对象。
在构造方法中,关键字 this 代表了该构造方法本次运行所创建的那个新对象。例如:
public class Demo {
private String name;
public Demo(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public static void main(String[] args) {
Demo demo = new Demo("Tom");
System.out.println("name=" + demo.getName());
}
}运行示例,输出结果如下:
name=Tom
上面代码中,Demo 构造方法中的 this 表示我们新创建的对象 demo。
this 关键字就是一个特殊的引用类型变量,起到通配符的作用,除了其变量名和引用关系是强制规定的之外,可以将其当作普通的引用变量来使用,即通过“this.成员”的方式来访问其引用的当前对象的属性和方法。