Java基本数据类型默认值由JVM自动初始化:成员变量(含static/实例字段)按类型填0、0.0f、'\u0000'、false;局部变量无默认值,必须显式赋值;数组元素无论位置均被初始化为对应默认值;包装类成员变量默认为null。

Java 中基本数据类型默认值初始化不是“主动操作”,而是由 JVM 在特定场景下自动完成的——关键看变量声明的位置和类型,不是靠你写代码去“初始化”,而是规则决定它“有没有默认值”。
成员变量自动填默认值
只要变量定义在类内部、方法外部(无论 static 还是实例字段),JVM 就会在对象创建(或类加载)时,按类型填入固定默认值:
- 整数型(byte/short/int/long)→ 0(long 是 0L,语义一致)
- 浮点型(float/double)→ 0.0f / 0.0d(不是整数 0)
- char → '\u0000'(Unicode 空字符,打印不可见,不是空格,也不是 null)
- boolean → false(不是 0 或 null)
局部变量必须手动赋值
写在方法里、循环中、if 块内的变量,JVM 不提供任何默认值。编译器会严格拦截未赋值就使用的写法:
- int x; 后直接 System.out.println(x); → 编译报错:“variable x might not have been initialized”
- 分支中只在一个路径赋值也不行:if (flag) x = 10; 而没有 else → 同样报错
- 安全写法:确保所有执行路径都覆盖,比如 int x = flag ? 10 : 20; 或显式初始化 int x = 0;
数组元素默认值与位置无关
只要执行了 new Type[n],不管数组是成员变量还是局部变量,JVM 都会批量填充元素默认值:
立即学习“Java免费学习笔记(深入)”;
- int[] a = new int[3]; → 元素为 {0, 0, 0}
- boolean[] b = new boolean[2]; → {false, false}
- char[] c = new char[1]; → {'\u0000'}
- String[] s = new String[2]; → 元素是 {null, null}(引用类型,不是空字符串)
注意:int[] arr; 只是声明,arr == null;不 new 就访问 arr[0] 会触发 NullPointerException。
包装类默认是 null,不是基本类型的零值
Integer、Boolean、Double 等是引用类型,作为成员变量时默认值是 null,不是 0 或 false:
- Integer count;(成员变量)→ 默认 null,不是 0
- int c = count; → 自动拆箱,运行时报 NullPointerException
- 安全做法:if (count != null) { c = count; } 或用 Objects.requireNonNull(count)


















