基本数据类型存储位置取决于声明方式:局部变量在栈中,成员变量和数组元素随对象存于堆中,常量池字面量存放于方法区。

基本数据类型不一定都存在栈里,关键看它怎么声明、在哪声明。
局部变量中的基本类型:通常在栈中
在方法内部定义的 int、char、boolean 等变量,属于局部变量。JVM 为每次方法调用分配一个独立的方法栈帧,变量名和值都直接存放在这个栈帧里。方法执行结束,栈帧弹出,变量自动消失。
- 例如:int x = 10; —— x 和 10 都在栈中
- 这种存储速度快、生命周期明确,但空间有限
成员变量中的基本类型:实际在堆中
如果基本类型是类的字段(即成员变量),它就随着对象一起被分配在堆内存中。因为对象本身在堆上创建,其所有字段——无论基本还是引用类型——都作为对象结构的一部分,一并存于堆中。
- 例如:class Person { int age = 25; },new Person() 后,age 字段和对象实例一起在堆中
- 此时栈中只可能有指向该 Person 对象的引用,而不是 age 本身
数组元素里的基本类型:取决于数组对象的位置
数组是引用类型,new int[]{1, 2, 3} 创建的是堆中的对象,那里面的每个 int 元素自然也在堆中。这直接打破了“基本类型一定在栈”的误解。
- 栈中只存数组引用(地址),比如变量 arr 的值是一个内存地址
- 真正的 1、2、3 存在堆上数组对象的数据区里
- 同理,ArrayList
中的 Integer 对象也在堆中,哪怕它包装的是基本值
常量池中的基本类型字面量:单独存放
编译期确定的常量,如 static final int MAX = 100; 或字符串字面量关联的某些基础值,可能被 JVM 放入方法区的运行时常量池,不占栈也不占堆的常规空间。
- 这类值由类加载器处理,生命周期与类一致
- 它们不随方法调用进出栈,也不随对象创建销毁

















