this关键字的用法

目录

一.概述

当一个对象创建成功之后(执行构造方法之前,对象已经创建成功),虚拟机(JVM)就会动态的分配一个引用,这个引用指向的就是创建出来的对象,并且该引用的名字就叫做this.可以理解为每一个方法内部都有一个局部变量叫this,每当初始化一个对象时,就把该对象的地址传递给了该对象每一个方法中的this变量,从而可以在方法内部使用这个的对象。

二.使用动机

this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this不能用于static方法中,因为this指代当前对象,而static无对象之说

三.使用方法

①当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。

如果在一个方法中如果没有局部变量和成员变量同名,那么在这个方法中使用成员变量也不必使用this.
class Person{
  int age;
  public Person(int age){
    this.age = age;
  }

  public int getAge(){
    return this.age;
  }
}

②通过this关键字调用成员方法

如果在方法内部调用同一个类的另一个方法,就不必使用this。
class Person{
  public void openMouth(){
    ……;
  } 

  public void speak(){
    this.openMouth();
  } 
}

③this关键字把当前对象传递给其他方法

举例:在口袋妖怪中,训练师可以将杰尼龟通过训练进化为卡咪龟。为了将杰尼龟进化为卡咪龟,需要将创建的杰尼龟对象传递给Natrue.Evolution()方法,它是一个外部的工具方法。为了将其自身传递给外部方法,必须使用this关键字

package com.game.ThisTest;

/*
    业务逻辑:在精灵宝可梦中,训练师可以将会使用泡沫光线的杰尼龟训练为
               会使用火箭头槌的卡咪龟
 */

//训练家类:拥有将杰尼龟训练成为卡咪龟的职责
class Trainer{
    public void practice(Zenigame zni){
        zni.useSkill();//杰尼龟使用技能
        zni.getEvolved().useSkill();//杰尼龟进化为卡咪龟后使用技能
    }
}

//卡咪龟类。卡咪龟可以使用火箭头槌技能
class Wartotortle{
    Wartotortle(Zenigame zni){
        System.out.println("杰尼龟进化为卡咪龟");
    }

    void useSkill(){
        System.out.println("卡咪龟,快使用火箭头槌!");
    }
}

//在自然情况下,杰尼龟会进化为卡咪龟
class Nature{
    static Wartotortle Evolution(Zenigame zni){
            return new Wartotortle(zni);
    }
}

//杰尼龟类,进化后会得到卡咪龟
class Zenigame{
    Wartotortle getEvolved(){
       return Nature.Evolution(this);//this表示传递杰尼龟对象
   }

   void useSkill(){
       System.out.println("杰尼龟,快使用泡沫光线!");
   }
}


public class Pokemon {
    public static void main(String[] args) {
            new Trainer().practice(new Zenigame());
    }
}

⑤当需要返回当前对象的引用时,就常常在方法写return this

这种做法的好处是:当你使用一个对象调用该方法,该方法返回的是经过修改后的对象,且又能使用该对象做其他的操作。因此很容易对一个对象进行多次操作。
//由于increment()通过this关键字返回了当前对象的引用,所以很容易对一个对象执行多次操作
public class ReturnThisTest {
    int i = 0;
    ReturnThisTest increment(){
        i += 2;
        return this;
    }
    void print(){
        System.out.println("i = " + i);
    }
    public static void main(String args[]){
        ReturnThisTest x = new ReturnThisTest();
        x.increment().increment().print();
    }
}

⑤在构造器中调用构造器需要使用this

构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法。但可以在一个构造方法中使用"this([参数1,参数2……]"的形式调用其他构造方法。 在使用this调用类的构造方法时,应注意一下几点: ☞只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。 ☞在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次。 ☞不能在一个类的两个构造方法中使用this互相调用。
class Person{
    public Person(){
        System.out.println("无参的构造方法被调用了……");
    }

    //构造方法中的this调用其他构造函数
    public Person(String name){
        this();
        System.out.println("有参的构造方法被调用了……");
    }
}

public class StructMethodTest {
    public static void main(String[] args) {
        new Person("MiaoWu");
    }
}

原文地址:https://www.cnblogs.com/miaowulj/p/14493179.html