• JAVA中的this关键字


    this是JAVA中一个非常重要的关键字。

    用法一:

    为了了解this的用法,先看以下代码

    package javastudy;
    
    public class ThisDemo2 {
    
        public static void main(String[] args) {
            Person1 l=new Person1(11,"lisi");
            l.speak();
        }
    }
    
    class Person1
    {
        int age;
        String name;
        Person1(int a,String b){        //形参a,b,可读形很差,因为a和b代表什么意思,从字面上来不容易理解。
            age=a;
            name=b;
        }
        void speak(){
            System.out.println("My name is "+name+",my age is "+age);
        }    
    }

    输出结果:My name is lisi,my age is 11

    以上代码,运行上没有任何问题,但是在可读性上存在问题。定义Person1类时,形参a、b的字面意思不得而知,需要结合上下文代码才能理解,阅读性较差。

    改造以上代码,如下:

    package javastudy;
    
    public class ThisDemo2 {
    
        public static void main(String[] args) {
            Person1 l=new Person1(11,"lisi");
            l.speak();
        }
    }
    
    class Person1
    {
        int age;
        String name;
        Person1(int age,String name){        //形参改为age和name
            age=age;    //
            name=name;     //
        }
        void speak(){
            System.out.println("My name is "+name+",my age is "+age);
        }    
    }    

    输出结果:My name is null,my age is 0

    在实例化对象时,给age和name进行了传值,但是对象在堆中的age、name却未接收到传值。原因就在于age=age,name=name这两句代码中。

    局部变量的名称与成员变量名称相同,JVM是无法进行区分的。

    为了区分局部变量与成员变量,将成员变量的值传递给对象,就要用到this关键字。

    如下

    package javastudy;
    
    public class ThisDemo2 {
    
        public static void main(String[] args) {
            Person1 l=new Person1(11,"lisi");
            l.speak();
        }
    }
    
    class Person1
    {
        int age;
        String name;
        Person1(int age,String name){        //
            this.age=age;    //
            this.name=name;    //
        }
        void speak(){
            System.out.println("My name is "+name+",my age is "+age);
        }    
    }

    this关键字代表本类的对象, 即哪个对象在调用this所在函数,this就代表哪个对象。

    如Person1 l=new Person1(11,"lisi"),l在调用Person1构造函数,this就代表l;如果增加代码Person1 w=new Person1(11,"wangwu"),this就代表w。所以,只要用this关键字,就可以简化代码。

    其实,当我在类中定义成员的变量和方法时,其前面都有隐含的this关键字,哪个对象调用,this就代码哪个对象。只有这个this在很多时候,都是可省略不写的。

    在同一类中,成员变量和局部变量相同时,要加this。

    用法二:

     先看以下代码:

    package javastudy;
    
    public class ThisDemo4 {
    
        public static void main(String[] args) {
            Person4 p4=new Person4(12,"SB");
            p4.speak();
        }
    }
    
    class Person4{
        int age;
        String name;
        Person4(int age) {
            this.age=age;        
        }
        public Person4(int age,String name) {
            this.age=age;    //重复
            this.name=name;
        }
        void speak(){
            System.out.println(name+"|"+age);
        }
    }    

    以上代码中,

    Person4(int age) {
    this.age=age;
    }

    这段代码重复写了。可在第二个构造函数中直接调用。用this语句直接调用。且this语句要写在首行。

    注:一般函数不能调用构造函数,只有构造函数才能调用构造函数。

    如下

    package javastudy;
    
    public class ThisDemo4 {
    
        public static void main(String[] args) {
            Person4 p4=new Person4(12,"SB");
            p4.speak();
        }
    }
    
    class Person4{
        int age;
        String name;
        Person4(int age) {
            this.age=age;        
        }
        public Person4(int age,String name) {
            this(age);    //this语句,直接调用。相当于p4(age)。
            this.name=name;
        }
        void speak(){
            System.out.println(name+"|"+age);
        }
    }

    示例:

    比较两个人的年龄是否相同

    public class ConfunDemo7 {
    
        public static void main(String[] args) {
            Personman p1 = new Personman(21);
            Personman p2 = new Personman(25);
            System.out.println(p1.bijiao(p2));
        }
    
    }
    
    class Personman {
        int age;
    
        Personman(int age) {            //构造函数,对象创建后,就传age给对象
            this.age = age;
        }
    
        public boolean bijiao(Personman p) {        //函数,用于比较函数使用对象与参数对象,返回的是两者年龄比较结果布尔值。
            return this.age == p.age;
    
        }
    
    }

    输出:false

    public class ConfunDemo7 {
    
        public static void main(String[] args) {
            People i = new People();
            People j = new People();
            i.age = 35;
            j.age = 55;
            System.out.println(i.bjnl(j));
        }
    
    }
    
    class People {
        int age;
    
        public boolean bjnl(People p) {
            return this.age == p.age;
        }
    }

    输出:false

    注:

    this只能在类定义时使用

  • 相关阅读:
    [BZOJ 4117] Weather Report
    [BZOJ 3233] 找硬币
    集合迭代器Iterator
    如何实现数组与List的相互转换?在 Queue 中 poll()和 remove()有什么区别?哪些集合类是线程安全的?
    ArrayList分别与LinkedList、Vector、Array的区别
    HashMap与TreeMap
    HashSet原理
    并发场景下HashMap死循环导致CPU100%的问题
    HashMap工作原理
    HashMap与HashTable的区别
  • 原文地址:https://www.cnblogs.com/ibelieve618/p/6392005.html
Copyright © 2020-2023  润新知