java基本类型变量只存值不存地址,存储位置由声明位置决定:局部变量存栈帧,成员变量随对象存堆,静态变量存方法区;各类型字节数固定,值按补码、ieee 754或unicode编码存储。

Java 基本类型变量不存“地址”,只存“值”本身——这个值放在哪儿,取决于它怎么定义、在哪定义。搞清这点,才能避开空指针误判、赋值困惑和性能盲区。
基本类型变量存在哪儿?看作用域就清楚
变量位置不由类型决定,而由声明位置决定:
-
局部变量(方法内定义,如
int x = 5;)→ 直接写入当前线程的栈帧,占固定字节数(如int占4字节),方法结束自动销毁 -
成员变量(类中非
static字段,如private long id;)→ 随所属对象一起分配在堆内存中,对象被回收时才释放 -
静态变量(带
static修饰,如public static boolean DEBUG = true;)→ 存在方法区(JDK 8+为元空间),类加载时分配,全局唯一,生命周期与类一致
每种类型占多少字节?别猜,用常量查
除boolean外,其余7种类型字节数由JVM规范强制固定,与平台无关:
-
byte、boolean(实际存储常按1字节对齐)→Byte.BYTES或1 -
short、char→Short.BYTES/Character.BYTES,都是2 -
int、float→ 固定4字节,对应Integer.BYTES -
long、double→ 固定8字节,对应Long.BYTES
boolean没有JVM规定大小,HotSpot中字段通常占1字节,boolean[]底层按byte[]实现,每个元素占1字节——不是1 bit,因为JVM不支持bit寻址。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
值怎么存?补码、IEEE 754 和 Unicode 决定能装什么
存储不是简单记数字,而是按标准编码:
-
byte~long:用二进制补码,范围可推导(如int是32位,范围为-2³¹到2³¹-1) -
float/double:按IEEE 754标准拆分为符号位+指数位+尾数位,导致0.1f + 0.2f != 0.3f -
char:2字节无符号整数,直接存Unicode码点(如'A'存0x0041) -
boolean:无null,未显式赋值时,成员变量默认false,局部变量必须初始化才能使用
数组和对象里的基本类型,布局更真实
单个变量可能因栈对齐被“膨胀”,但数组暴露最原始布局:
-
int[1000]在堆中连续占用1000 × 4 = 4000字节,毫无冗余 -
boolean[1000]在HotSpot中实际占约1000字节(不是1000 bit) - 对象字段中的基本类型会受对象头、字段重排序、填充字节影响,不能直接累加各字段字节数估算对象大小
赋值永远是值拷贝:int a = 10; int b = a;之后改b不影响a;也没有继承、方法或锁能力——它们只是内存里一段确定长度的原始比特。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










