java面向对象之this关键字的内存原理
在 Java 中,this 是一个隐含的对象引用,表示“当前对象自己”,用来区分局部变量与成员变量
this的本质:所在方法调用者的地址值
1. 三大内存区回顾
方法区(Method Area / 元空间)
存放类的结构信息:类名、方法字节码、常量池、静态变量等。
类一旦被加载,类的元信息就进入方法区。
堆(Heap)
存放 new 出来的对象实例,每个对象都对应一块堆空间。
成员变量(非 static)随对象存放在堆中。
栈(Stack)
存放方法调用时的栈帧,里面有局部变量表、操作数栈等。
方法的参数、局部变量、this 引用都存在栈里。
2.示例
假设有如下代码
class Student {String name; // 成员变量(在堆里)public void setName(String name) {this.name = name;}
}
方法执行时,内存中同时存在三份信息:
-
方法区:存放 Student 类的模板(其中有个字段叫 name)。
-
堆:new Student() 出来的对象,里面有一个 name 成员变量。
-
栈:setName(“Alice”) 调用时,方法参数 name 存在栈帧里。
这样就出现了“名字重复”,但是实际上一个在堆里,一个在栈里。
因为this的本质是方法调用者的地址值,也就是堆中的对象,所以代码执行时,this.name
指的就是堆中的该成员变量;而name因为就近原则,就是形参,也是栈中的参数"Alice"