请问以下说法是否正确?为什么?
static基础变量的值存放在方法区中。
static引用变量的引用存放在方法区中,值存放在堆区中。
非static的基础成员变量的值存放在堆区中。
非static的引用成员变量的引用和值全部存放在堆区中。
方法中的基础变量的值存放在操作数栈中。
方法中的引用变量的引用存放在操作数栈中,值存放在堆区中。
请问以下说法是否正确?为什么?
static基础变量的值存放在方法区中。
static引用变量的引用存放在方法区中,值存放在堆区中。
非static的基础成员变量的值存放在堆区中。
非static的引用成员变量的引用和值全部存放在堆区中。
方法中的基础变量的值存放在操作数栈中。
方法中的引用变量的引用存放在操作数栈中,值存放在堆区中。
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
首先需要明确一点:java中的对象都是存储在堆中的,那么对象中的所有变量,也就存储在堆中。所以上述你说的各种变量的值,都是存储在堆中的。
但是,java程序在执行的过程中,会为每个方法创建一个帧栈,压入java虚拟机栈中,这个帧栈会存储局部变量表、操作数栈、动态链接、方法出口等一系列信息。你要关注的是这个局部变量表,它存储了某个对象的reference数据(也就是你说的引用),用来帮助java程序定位需要访问的对象。

总结起来就是:引用存在栈中,对象的实例存储在堆中。
至于对象的访问定位方式,目前主流的方式有使用句柄和直接指针两种,具体细节可以参考《深入理解java虚拟机(第2版)》的2.3.3节(对象的访问定位)