Java八大基本类型默认值仅对成员变量生效,局部变量必须显式初始化;数组元素new后自动填默认值;包装类和引用类型默认为null。

Java 八大基本数据类型默认值只对成员变量生效,局部变量必须显式初始化;数组元素无论声明位置,只要完成 new 就自动按类型填默认值;包装类和引用类型默认为 null,不是基本类型的零值。
成员变量自动初始化,局部变量必须赋值
这是最常踩坑的边界:类里直接定义的变量(实例或静态字段)由 JVM 在对象创建时统一设默认值;而方法内、代码块内定义的变量,编译器严格禁止未赋值就使用。
-
成员变量示例:
int count;→ 默认为0;boolean flag;→ 默认为false;char c;→ 默认为'\u0000'(不是空格,是 ASCII 0) -
局部变量反例:
void test() { int x; System.out.println(x); }→ 编译直接报错“可能未初始化” - 分支路径要全覆盖:if 中只给一个分支赋值不行,else 或所有可能路径都得确保变量被赋值,否则仍编译失败
数组元素默认值与声明位置无关
只要执行了 new Type[n],JVM 就会批量填充对应默认值——不管它是成员变量还是局部变量,也不依赖是否在类初始化块中。
-
int[] arr = new int[3];→ 元素为{0, 0, 0} -
boolean[] flags = new boolean[2];→{false, false} -
char[] cs = new char[1];→{'\u0000'} -
注意:仅声明
int[] arr;不触发初始化;String[] strs = new String[2];每个元素是null,不是空字符串
包装类和引用类型默认为 null
Integer、Boolean、String 等都是引用类型,它们的成员变量默认值是 null,和基本类型语义完全不同。自动拆箱时极易引发 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
-
Integer num;(成员变量)→ 默认为null,不是0 -
int x = num;→ 运行时报 NPE,因试图对null拆箱 - 安全写法:
if (num != null) { x = num; }或用Objects.requireNonNull(num) - 数组如
Integer[] nums = new Integer[2];→ 元素是两个null,非0
浮点与字符的默认值易被误解
float 和 double 默认是 0.0f 和 0.0d,不是整数 0;char 默认是 '\u0000',视觉不可见但有实际编码值,别误当成空格或 null。
-
float f;→ 值为0.0f,参与运算时类型仍是 float -
char c;→ 值为'\u0000',System.out.println(c)什么也不输出(不是空白,是控制字符) - 比较浮点数永远别用
==,应写成Math.abs(a - b) - 金额计算必须用
BigDecimal,不用float/double


















