Java中基本类型和引用类型的默认值由内存模型和语言设计决定:成员变量中基本类型有确定默认值(如int为0),引用类型为null;局部变量无默认值,必须显式初始化;null仅适用于引用类型,判空操作不可用于基本类型。

Java 中基本数据类型和引用类型的默认值,不是“习惯不同”,而是由内存模型和语言设计决定的硬性规则。搞清这点,能避开大量空指针和逻辑错误。
成员变量的默认值行为完全不同
类的成员变量(字段)在未显式赋值时,JVM 会自动赋予默认值——但两类类型规则截然不同:
- 基本类型成员变量一定有确定值:int 是 0、boolean 是 false、char 是 '\u0000'、double 是 0.0,无需初始化就能安全读取或参与运算
- 引用类型成员变量统一为 null:String name;ArrayList list;自定义对象 obj;这些声明后都指向“什么也没有”,直接调用方法或访问属性会立刻抛出 NullPointerException
局部变量不享受默认值待遇
方法内部定义的变量(局部变量)不受默认值规则保护:
- 基本类型局部变量必须显式初始化才能使用,int x; System.out.println(x); 编译直接报错
- 引用类型局部变量同样必须赋值,String s; s.length(); 也会编译失败,哪怕它“理论上可以是 null”——因为 JVM 要求明确赋值路径
null 是引用类型的专属标识
null 不是一个值,而是一种状态,只对引用类型有意义:
立即学习“Java免费学习笔记(深入)”;
- int i = null; 是语法错误,编译通不过
- Integer i = null; 合法,因为 Integer 是引用类型(包装类),它的变量存的是地址,null 表示“当前没指向任何对象”
- 判空操作只适用于引用类型:if (list != null) { list.size(); } —— 对基本类型做这种判断既无必要也不合法
默认值影响实际编码习惯
这个差异直接决定日常写法:
- 声明 ArrayList 成员时,常配合初始化:private List
items = new ArrayList(); 避免后续每次都要判空 - 布尔标志位用 boolean done = false; 而不用 Boolean done = null; —— 后者引入了三态(true/false/null),增加分支复杂度
- DTO 或配置类中,字符串字段若允许为空,应明确注释或用 Optional 包装,而不是依赖默认 null 导致调用方反复判空


















