Java基本类型成员变量默认值由JVM规范固定:整型为0,浮点型为0.0,char为'\u0000',boolean为false;局部变量无默认值;数组元素按类型初始化;包装类默认为null。

Java 中基本数据类型默认值不是靠“运行时查看”或“打印出来才知”,而是由 JVM 规范明确定义的固定规则。你不需要查文档运行一遍才能确认,只要理解适用场景和类型对应关系,就能准确说出每个类型的默认值。
成员变量默认值可直接验证
在类中声明未赋值的基本类型字段,JVM 创建对象时自动初始化。写个简单类就能看到:
class Demo {
byte b;
short s;
int i;
long l;
float f;
double d;
char c;
boolean bool;
}然后在 main 中打印:
立即学习“Java免费学习笔记(深入)”;
Demo d = new Demo(); System.out.println(d.b); // 0 System.out.println(d.s); // 0 System.out.println(d.i); // 0 System.out.println(d.l); // 0 System.out.println(d.f); // 0.0 System.out.println(d.d); // 0.0 System.out.println((int)d.c); // 0(即 '\u0000' 的 Unicode 码点) System.out.println(d.bool); // false
注意:char 默认是 '\u0000',它不可见,但 (int)c 输出 0;boolean 只能是 false,不能是 0 或 null。
局部变量没有默认值,编译器会拦住你
下面代码无法通过编译:
void test() {
int x;
System.out.println(x); // 编译错误:variable x might not have been initialized
}这说明默认值规则只对类字段(含 static)生效,方法内变量必须显式赋值。
数组元素也有默认值,和声明位置无关
即使数组是局部变量,只要执行了 new,元素就按类型初始化:
void arrayTest() {
int[] a = new int[2]; // {0, 0}
boolean[] b = new boolean[1]; // {false}
char[] c = new char[1]; // {'\u0000'}
}但 int[] a;(仅声明)此时 a == null,还没分配内存,不触发元素初始化。
包装类默认是 null,不是基本类型的默认值
这点特别容易错:
class Holder {
Integer num; // null,不是 0
Boolean flag; // null,不是 false
}如果直接 int x = holder.num; 会触发自动拆箱,抛出 NullPointerException。
快速记忆表(仅对成员变量有效)
- 整数型(byte/short/int/long)→ 0(long 写作 0L)
- 浮点型(float/double)→ 0.0f / 0.0(double 后缀可省)
- char → '\u0000'(空字符,不是空格、不是 null)
- boolean → false
不复杂但容易忽略


















