基本数据类型在内存中直接存储值而非地址,生命周期由作用域决定:局部变量存栈、成员变量随对象存堆、静态变量存方法区;栈中存放真值,如int占4字节,值拷贝隔离,无null,有默认值。

基本数据类型在内存中直接存值,不存地址,位置和生命周期由作用域决定:局部变量进栈,成员变量随对象进堆,静态变量进方法区。
栈里放的是真值,不是指针
比如 int count = 10;,JVM 就在当前线程的栈帧里划出 4 字节空间,把二进制 10 原样写进去。不是存一个“指向 10 的地址”,而是 10 本身就在那儿。
- 方法执行完,整个栈帧弹出,这个 10 就自动消失,不归垃圾回收器管
- 多个同值局部变量(如 int a = 5; int b = 5;)可能共享同一份字面值(取决于 JVM 实现和编译优化)
- 栈分配快、释放自动,适合生命周期明确的小数据
每种类型占多少字节是写死的
跟操作系统位数或 CPU 架构无关,JVM 严格规定:
- byte / boolean / char:各占 1 字节(注意:char 是无符号 16 位,但 Java 中占 2 字节)
- short:2 字节
- int / float:4 字节
- long / double:8 字节
大小固定,意味着取值范围也固定,超出就溢出——这不是内存不够,是类型设计如此。
没有 null,只有默认值或必须初始化
基本类型变量永远有值:
- 作为类的成员变量时,未赋值也有默认值:int → 0,boolean → false,char → '\u0000'
- 作为方法内的局部变量时,必须显式初始化才能使用,否则编译报错
- 不存在“空值”概念,所以不能像引用类型那样用 == null 判断
值拷贝,彼此隔离
赋值或传参时,复制的是值本身:
- int a = 100; int b = a; → b 得到的是 100 的副本,改 b 不影响 a
- 方法接收 int x 参数时,传进来的是实参的值拷贝,函数内修改 x 不会改变外部变量
- 这种行为源于“栈中存值”的本质,天然支持线程安全的局部计算

















