目录
一.概述
当一个对象创建成功之后(执行构造方法之前,对象已经创建成功),虚拟机(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");
}
}
