此文帮助你理清局部变量和成员变量存储位置的一些细节
先来看一段代码:
public class StudyVariable {
// 成员变量 -- 基本数据类型
private int a;
// 成员变量 -- 引用数据类型
private BigDecimal decimal;
public StudyVariable() {
}
public StudyVariable(int a, BigDecimal decimal) {
this.a = a;
this.decimal = decimal;
}
public void doYouKnow() throws InterruptedException {
// 局部变量 -- 基本数据库类型
int k = 1;
// 局部变量 -- 引用数据类型
StudyVariable objectVa = new StudyVariable();
System.out.println("do you know...");
TimeUnit.SECONDS.sleep(1000);
}
public static void main(String[] args) throws InterruptedException {
StudyVariable o = new StudyVariable(10, BigDecimal.ZERO);
o.doYouKnow();
}
}
相信大家对于上图的数据类型的标注都能够理清楚,不同的变量也会有不同类型。
归纳
这里先给出这几个类型的总结,我们下面再来实际分析。
局部变量 | 成员变量 | |
---|---|---|
基本数据类型 | 变量在虚拟机栈上 | 变量都在堆上 |
引用数据类型 | 变量值在虚拟机栈上,变量值指向的对象在堆上 | 变量值以及变量值指向的对象都在堆上 |
具体分析
我这里直接运行了上面的代码,dump出JVM的内存快照。
- 可以看到这里只有这两个StudyVariable对象,但是并没有这两个对象的引用名称
- StudyVariable对象内部的field中属性【a】和【deciaml】是有引用名称的,同时它们也存在变量的值,这里有引用名称其实也可以理解。
- 搜索局部变量【k】是搜索不到的。