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 是为了开发,应该关注使用最频繁的用法,如果花费太多精力去研究语言本身的各种稀奇古怪的用法,简直是本末倒置。

posted @ 2020-09-01 17:10  Binge-和时间做朋友  阅读(127)  评论(0编辑  收藏  举报