Java基本类型只存值不存引用:局部变量存栈帧中,成员变量嵌入堆中对象,静态变量存元空间,数组元素连续存堆中;均不可为null,赋值为值拷贝。

Java 基本数据类型不存“引用”,只存“值”——这个值直接写进内存特定位置,位置和大小由 JVM 严格规定,跟变量声明在哪有关。
局部变量:值直接进栈帧
在方法里写的 int a = 10;,JVM 就在当前线程的栈帧中划出 4 字节,把 0x0000000A 这个二进制数原封不动塞进去。
- 栈分配极快,方法结束时整个栈帧自动弹出,值立刻消失,不走 GC
- 每种类型占字节数固定:byte=1、char/short=2、int/float=4、long/double=8
- 局部变量必须显式初始化才能用,否则编译报错
成员变量:随对象一起躺堆里
写在类里没加 static 的基本类型字段(比如 public double price;),不会单独存在栈上,而是嵌入对象实例的数据区,随对象一起分配在堆中。
- JVM 可能重排字段顺序(如把 long 放最前、boolean 放最后),只为减少填充字节、提升 CPU 缓存效率
- 对象被回收时,这些字段才一并释放
- 未赋值时有默认值:0、false、'\u0000'(不是 null)
静态变量和数组元素:两个例外
这两类基本类型值不走局部栈:
立即学习“Java免费学习笔记(深入)”;
- static int version = 1; → 存在元空间(JDK 8+ 的方法区),随类加载而生,全局共享
- int[] arr = new int[5]; → 数组对象在堆上,5 个 int 值连续排布在该数组的元素区,不是 5 个独立变量
没有 null,也不参与 GC 判定
基本类型永远有值,也永远不是对象:
- 不能赋值为 null;int i = null; 编译不过
- 赋值是值拷贝:int a = 5; int b = a; 后改 b 不影响 a
- 没继承、没方法、不能当锁对象——它们只是内存里的原始比特


















