java再复习——this的真正意义以及方法区的方法信息与对象的方法是如何产生关联的

时间:2022-10-17 00:42:43

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调用的时候,其实是这样的:

	JVM.setSex(this,super,....);

每次调用的时候,JVM会传入当前调用此方法的对象的地址,以及它的父类的对象的地址(这在JVM中,对象是一个包裹的对象形态,参照一个类的初始化流程,其实this与super传入的都是当前对象的地址)。

还记得上次说过的代码的大体执行流程与内存状态,JVM在加载类的信息的时候会将方法也加载到方法区作为一个常量,然后对象中的对方指向的是方法区中的方法,这是为什么呢?将方法代码加载到方法区这个想法不难理解,这与将静态变量一并加载到方法区一样,因为他们都是属于类的,没必要给每个对象中声明一份,那么如何保证每个对象执行方法,却是与本对象相关的执行结果呢?就是这个隐式参数的作用!看图

java再复习——this的真正意义以及方法区的方法信息与对象的方法是如何产生关联的


如图所示,对象中的方法执行方法区的方法信息,JVM调用方法区的方法时,会默认的传入当前调用此方法的对象的地址,也就是0x45ed,而这个方法中默认的每行代码前面都会加上this.的语句,这样就会又找回到这个对象身上的属性,以及做的一切操作,都是与当前所调用此方法的对象相关。