this关键字:指代当前调用某方法的实际对象
this关键字最常用场景:
public class Student { String name; public Student(String name) { this.name = name; } }
在同名的情况下,用来区分是局部变量还是对象的全局变量,当然还有其他场景,比如this()调用本类的其他构造方法,或者其他方法等等吧。
我们也知道,其实在方法在中调用每一个方法,或者使用属性,JVM默认会在前面加上一个this.的关键字,即时我们不写出来,比如:
public class Student { String sex; public void setSex(String sexStr){ sex = sexStr; //相当于this.sex = sexStr; } }
JVM.setSex(this,super,....);
每次调用的时候,JVM会传入当前调用此方法的对象的地址,以及它的父类的对象的地址(这在JVM中,对象是一个包裹的对象形态,参照一个类的初始化流程,其实this与super传入的都是当前对象的地址)。
还记得上次说过的代码的大体执行流程与内存状态,JVM在加载类的信息的时候会将方法也加载到方法区作为一个常量,然后对象中的对方指向的是方法区中的方法,这是为什么呢?将方法代码加载到方法区这个想法不难理解,这与将静态变量一并加载到方法区一样,因为他们都是属于类的,没必要给每个对象中声明一份,那么如何保证每个对象执行方法,却是与本对象相关的执行结果呢?就是这个隐式参数的作用!看图
如图所示,对象中的方法执行方法区的方法信息,JVM调用方法区的方法时,会默认的传入当前调用此方法的对象的地址,也就是0x45ed,而这个方法中默认的每行代码前面都会加上this.的语句,这样就会又找回到这个对象身上的属性,以及做的一切操作,都是与当前所调用此方法的对象相关。