Java引用变量存储对象在堆中的内存地址而非对象本身,本质是受控指针;未赋值时为null;局部变量存栈、成员变量随对象存堆、静态变量存方法区;多引用可共享同一对象,实现按共享传递;基本类型则直接存值于栈且不参与GC。

Java 引用类型变量存储的是对象在堆内存中的地址值(即引用),而不是对象本身。
引用变量本质上是“指针的抽象”
虽然 Java 不允许程序员直接操作内存地址,但 JVM 内部用类似指针的方式管理对象位置。当你声明一个引用变量,比如:
- String s = new String("hello"); —— 变量 s 存储的不是字符串内容,而是该 String 对象在堆中实际存放位置的地址(例如 0x7f8a1c…)
- 这个地址通常是一个 32 位或 64 位的数值,具体取决于 JVM 的指针压缩策略(如开启 UseCompressedOops 时可能用 32 位表示)
- 如果未赋值,引用变量默认值为 null,代表“不指向任何对象”
区分“引用变量”和“对象本体”
对象本身始终分配在堆内存中,而引用变量可以存在于不同位置:
- 局部引用变量(如方法内定义)存放在栈帧的局部变量表中
- 成员引用变量(如类的字段)随对象一起存在堆中
- 静态引用变量存放在方法区(元空间)的类信息里
多个引用可指向同一对象
因为存储的是地址,所以多个变量可以共享同一个对象:
立即学习“Java免费学习笔记(深入)”;
- List<String> a = new ArrayList<>(); List<String> b = a; —— 此时 a 和 b 存储的是相同的地址,修改 b.add("x") 会影响 a.size()
- 这正是 Java 中对象传递为“按共享传递(pass-by-sharing)”的原因:传的是引用值的副本,不是对象副本,也不是 C++ 那样的真正指针
注意:基本类型完全不同
int、double、boolean 等基本类型变量直接存储数据值(如 42、3.14),它们不涉及堆或地址概念,也不受 GC 管理。










