Java 基础-this 关键字
this 是什么
this表示当前对象,只能出现在实例上下文中。它最常见的用途有四个:区分同名的成员变量与参数、调用本类其他构造方法、传递当前对象、返回当前对象实现链式调用。
区分成员变量与参数
当构造方法或 setter 的参数与成员变量同名时,参数会遮蔽成员变量。
this.name表示当前对象的成员变量,name表示方法参数。
class User {
private String name;
User(String name) {
this.name = name;
}
void setName(String name) {
this.name = name;
}
}
如果写成
name = name,只是将参数赋值给自己,成员变量不会被修改。
调用本类其他构造方法
this(...)用于调用同一个类中的其他构造方法,常用来集中复用初始化逻辑。
class User {
private final String name;
private final int age;
User(String name) {
this(name, 0);
}
User(String name, int age) {
this.name = name;
this.age = age;
}
}
[!yellow]
Java 24 及之前,this(...)必须是构造方法的第一条语句。Java 25 开始支持灵活构造方法体,可以在它之前执行不访问当前对象的语句。面试时应先确认 Java 版本。
传递当前对象
this可以作为普通对象引用传给其他方法或构造方法,常见于回调注册和对象关联。
class ListenerRegistry {
void register(Listener listener) {
}
}
class Listener {
Listener(ListenerRegistry registry) {
registry.register(this);
}
}
返回当前对象
实例方法返回
this,调用方就可以继续操作同一个对象,这是链式调用的基础。
class Builder {
private String value;
Builder value(String value) {
this.value = value;
return this;
}
Builder print() {
System.out.println(value);
return this;
}
}
new Builder().value("Java").print();
this 面试考点
this表示当前对象,不能在static方法或静态代码块中使用。- 调用本类实例变量或实例方法时,
this.通常可以省略;发生同名遮蔽时不能省略。this(...)只能出现在构造方法中,用于调用本类的其他构造方法。- 构造方法之间不能通过
this(...)形成直接或间接的循环调用。this是关键字表达式,不是可重新赋值的变量,this = other会编译失败。
this 与 super 的区别
| 对比项 | this |
super |
|---|---|---|
| 表示对象 | 当前对象 | 当前对象的父类部分 |
| 访问成员 | 当前类的实例字段和方法 | 父类中被遮蔽的字段或被重写的方法 |
| 构造调用 |
this(...),调用本类其他构造方法 |
super(...),调用父类构造方法 |