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

    作者:Binge
    本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    虚方法的调用是怎么实现的(单继承VS多继承)
    C++ Data Member内存布局
    删除单链表,你会吗?
    最近面试遇到的Windows相关的题目
    C# 文章导航
    移动端开发文章导航
    Vue源码阅读(一) 准备工作
    vue-router源码阅读(一) 内部探究
    Vuex源码阅读(二) store内的getters实现逻辑
    Vuex源码阅读(一) new Vuex.Store()内部探究
  • 原文地址:https://www.cnblogs.com/binbingg/p/13597246.html
Copyright © 2011-2022 走看看