this关键字的作用和本质
this的作用:就是用来区分成员变量和局部变量的
this的本质:所在方法调用者的地址值
内存图从底层理解
1.简单的区分成员和局部
先来看两行代码
public class Student {
private int age;
public void method(){
int age = 10;
System.out.println(age);
System.out.println(this.age);
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.method();
}
}
首先是main方法先进栈然后执行main方法里面的第一行代码,这时候用到的是student类,会把student的字节码文件加载到方法区
Student s = new Student();
左边student s 会在堆内存中记录变量s,等号右边会有一个new关键字,会在堆内存中开辟一个空间,
由于之前只定义了一个age
private int age;
所以在堆内存开辟的空间中只有一个age,除此之外还有成员方法的地址值,之后会把堆内存中的地址值赋值给占内存中的s变量

接下来运行method方法
调用者s记录的地址值就是001
this也是记录的001的地址值
this的本质:代表方法调用者的地址值
接下来在方法method中记录了age的值是10
sout(age)会触发就近原则,调用age=10;
this代表的是地址值,然后就会去堆内存中的那个地址找到age存储的值,然后就会把堆内存中存储的数据打印出来
2.含有set和get方法的内存图
先上代码
public class Student {
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
public class test {
public static void main(String[] args) {
Student s = new Student();
s.setName("小橙");
System.out.println(s.getName());
}
}
首先程序执行main方法。main方法进栈 s 记录在堆内存中开辟的空间的地址值001
堆内存在new关键字的作用下开辟一个空间地址值是001,储存的默认的数据 nam = null;
这时内存图是这样子的

接下来执行setAge方法
此时会接受set赋值的“小橙”给name 。现在 name = “小橙”
this.name表示堆内存中的name null
this.name = name;
这个语句就会把“小橙”的数据,赋值给堆内存中的name记录的数据
此时的内存图是这样的

当再生成一个对象的时候,会开辟一个新的空间,过程也是和上面一样的,这里不再进行多的赘述