在 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.成员”的方式来访问其引用的当前对象的属性和方法。