Java this关键字
在 Java 中,this 关键字指的是当前对象的引用,它有 5 种用法,下面分别给大家介绍一下。
1、消除语法歧义(最常用)
这种情况一般出现在有参构造器中,当构造器的参数与类的属性(或成员变量)名称完全相同时,导致 Java 编译器无法区别,从而产生语法歧义,编译报错。
解决办法就是使用 this 关键字,如下代码:
public class Man {
private int age;
private String name;
public Man (int age, String name) {
this.age = age;
this.name = name;
}
}
Man 类有两个成员变量,分别是 age 和 name,在使用有参构造器的时候,如果参数名和成员变量的名字相同,就需要使用 this 关键字消除歧义。
其中 this.age 是指类的成员变量,age 是指有参构造器的参数。
2、引用类的其他构造器
当一个类的构造器有多个,可以使用 this 关键字在一个构造器内部调用其他构造器,从而减少代码量
比如说,在无参构造器中调用有参构造器,如下代码:
public class Man {
private int age;
private String name;
public Man(int age, String name) {
this.age = age;
this.name = name;
}
public Man() {
this(23, "张三"); //显示默认构造器调用有参构造器
}
}
也可以在有参构造器中调用无参构造器,如下代码:
public class Man {
private int age;
private String name;
public Man(int age, String name) {
this(); // 有参构造器内部调用显式默认构造器
this.age = age;
this.name = name;
}
public Man() {
}
}
需要注意的是,Java 语法要求 this() 必须是构造器方法体中的第一条语句,否则就会报错。不信,你可以自己试一试哈。
3、作为方法参数传递
先看下面的代码
public class Test {
public Test() {
print(this);
}
private void print(Test test) {
System.out.println("print 方法:" + test);
}
public static void main(String[] args) {
Test test = new Test();
System.out.println("main方法:“+test);
}
}
我在显式默认构造器中调用了 print( ) 方法,然后把 this 关键字作为参数传递给该方法,接着在 print( ) 方法中打印 this 关键字的值。在 程序入口 main() 方法中,实例化 Test 对象,然后同样打印对象名的值。
来打印看一下结果:
print方法: com.cmower.baeldung.this1.ThisTest@573fd745
main方法:com.cmower.baeldung.this1.ThisTest@573fd745
从结果中可以看得出来,this 关键字和 test 对象名都指向同一个对象的引用(或地址),而那个对象就是使用 new 关键字创建的 test 对象。
4、链式调用
学过 JavaScript,或者 jQuery 的读者可能对链式调用比较熟悉,类似于 a.b().c().d(),仿佛能无穷无尽调用下去。
在 Java 中,也可以使用 this 关键字编写链式调用,代码如下:
public class Man {
private int age;
private String name;
public Writer() {
}
public Man SetName(String name) {
this.name = name;
return this;
}
public Man SetAge(String age) {
this.age = age;
return this;
}
}
这时候,创建 Man 对象就可以通过链式调用的方式设置姓名和年龄
Man man = new Man();
man.setName("张三“).setAge(23);
5、在内部类中访问外部类对象
自从 Java 8 的函数式编程出现后,就很少用到 this 在内部类中访问外部类对象了
public class Test {
private String name;
class InnerClass {
public InnerClass() {
Test test = Test.this;
String name = test.name;
}
}
}
在内部类 InnerClass 的构造方法中,通过外部类.this 可以获取到外部类对象,然后就可以使用外部类的成员变量了,比如说 name。
6、总结
以上 5 种 this 关键字的使用没必要全部掌握,很多用法实际项目开发中很少或根本用不到,所以仅作了解而已即可。毕竟我们学 Java 是为了开发,应该关注使用最频繁的用法,如果花费太多精力去研究语言本身的各种稀奇古怪的用法,简直是本末倒置。