Java中类型分为基本类型和引用类型:基本类型存值于栈,有默认值且不可为null;引用类型存地址于栈、对象于堆,默认值为null,支持方法调用与继承。

Java 中的类型分为基本类型(primitive types)和引用类型(reference types),它们在内存分配、默认值、取值范围等方面有本质区别。理解这些差异,是写出健壮、高效 Java 代码的基础。
基本类型:栈上存储,有固定范围和默认值
Java 有 8 种基本类型,全部直接存放在栈内存中(局部变量)或对象内部(成员变量),不涉及堆内存分配。它们没有方法,不能为 null,且每个都有明确的默认值和数值边界。
- byte:1 字节,范围 -128 ~ 127,默认值 0
- short:2 字节,范围 -32,768 ~ 32,767,默认值 0
- int:4 字节,范围 -2³¹ ~ 2³¹−1(约 ±21 亿),默认值 0
- long:8 字节,范围 -2⁶³ ~ 2⁶³−1,默认值 0L
- float:4 字节,单精度浮点,遵循 IEEE 754 标准,默认值 0.0f
- double:8 字节,双精度浮点,默认值 0.0d
- char:2 字节,Unicode 字符(0 ~ 65535),默认值 '\u0000'(空字符)
- boolean:无明确定义字节大小(JVM 实现相关),仅 true/false,默认值 false
注意:基本类型变量声明后若未显式赋值,在类成员位置会自动初始化为默认值;但在方法内(局部变量)必须显式赋值才能使用,否则编译报错。
包装类型:堆上对象,可为 null,有缓存机制
对应 8 种基本类型,Java 提供了 8 个包装类(如 Integer、Boolean、Character 等),属于引用类型,实例存于堆内存,变量本身存栈中指向堆地址。
立即学习“Java免费学习笔记(深入)”;
- 默认值为 null(不是 0 或 false)
- 支持自动装箱(int → Integer)和拆箱(Integer → int),但可能引发 NullPointerException
- Integer、Byte、Short、Long、Character 在 -128 ~ 127 范围内会复用缓存对象(通过 valueOf() 创建),超出则新建对象
- Boolean 只有两个实例:TRUE 和 FALSE,全部复用
例如:Integer a = 100; Integer b = 100; → a == b 为 true;但 Integer c = 200; Integer d = 200; → c == d 通常为 false(取决于是否命中缓存)。
引用类型:堆内存主体,默认值统一为 null
包括类(String、ArrayList 等)、接口、数组、枚举、注解等。所有引用类型变量都保存对象的内存地址(或 null),实际对象分配在堆中。
- 成员变量未初始化时,默认值恒为 null
- 局部变量不自动初始化,必须显式赋值后才能使用
- 数组是特殊引用类型:声明后为 null;用 new 创建后,元素按类型初始化(基本类型元素为默认值,引用类型元素为 null)
- String 是不可变引用类型,字面量存储在字符串常量池(堆中特定区域),重复字面量共享同一对象
例如:String s; 在类中等价于 String s = null;;而 String[] arr = new String[3]; 创建长度为 3 的数组,其中 arr[0]、arr[1]、arr[2] 均为 null。
内存与生命周期关键点
区分清楚“变量存放位置”和“数据存放位置”很重要:
- 局部基本类型变量(如方法内的 int x = 5;):变量名和值都在栈中
- 局部引用类型变量(如 String s = "abc";):变量名在栈中,字符串对象在堆中(常量池或堆内存),变量存的是地址
- 成员变量(无论基本还是引用):随对象一起分配在堆中;基本类型值直接嵌入对象结构,引用类型变量存地址
- 静态变量(static):存于方法区(JDK 8+ 为元空间),生命周期与类相同
GC 主要回收堆中不再被任何栈/静态变量引用的对象;栈帧随方法调用结束自动销毁,不需 GC 干预。


















