Java中成员变量未显式初始化时会自动获得默认值:基本类型如int为0、float为0.0、char为'\u0000'、boolean为false;引用类型(包括Object、String、Integer等)均为null;该机制仅适用于类字段(静态/实例),不适用于必须显式初始化的局部变量。

Java中成员变量(即类的字段)在未显式初始化时,会自动获得默认初始值,这是由JVM规范明确规定的。这个默认值与变量是否为基本类型或引用类型直接相关,且仅适用于类成员变量(包括静态和实例字段),不适用于局部变量(局部变量必须显式初始化才能使用,否则编译报错)。
int 类型的默认值是 0
所有基本类型的整数类型(byte、short、int、long)默认值都是 0;浮点类型(float、double)是 0.0;字符类型(char)是 '\u0000'(空字符,不是空格);布尔类型(boolean)是 false。
- 示例:声明一个 int 成员变量但不赋值,打印它会输出 0
- 该行为与是否为 static 无关 —— 静态 int 和实例 int 默认都是 0
- 注意:这和 C/C++ 不同,Java 保证了确定性,默认值不会是“随机内存值”
Object 类型(即引用类型)的默认值是 null
所有引用类型(包括自定义类、数组、接口、String、包装类如 Integer 等)的默认初始值都是 null。
- 例如:
String name;、List<String> list;、MyClass obj;在未 new 或赋值前,其值均为 null - 访问 null 引用的成员(如调用方法或访问字段)会抛出
NullPointerException - 包装类(如 Integer)虽是对象,但作为成员变量时也默认为 null,不是 0 —— 这点常被误认为等同于 int
如何验证这些默认值?
最直接的方式是写一个简单测试类,在构造器或普通方法中打印未初始化的成员变量:
立即学习“Java免费学习笔记(深入)”;
- 新建一个类,声明几个 int 和 Object 类型的字段,不赋值
- 在 main 方法中 new 该类实例,然后 System.out.println 输出各字段
- 观察输出结果:int 打印 0,String 打印 null,Integer 打印 null
- 也可用 IDE 调试,查看字段值(调试器中会明确显示 “0” 或 “null”)
特别注意作用域边界
只有类级别的字段才享受默认初始化;方法内部定义的变量(局部变量)没有默认值:
-
void test() { int x; System.out.println(x); }→ 编译失败 -
class A { int x; void test() { System.out.println(x); } }→ 正确,输出 0 - 这是因为局部变量存储在栈帧中,生命周期短,JVM 不为其自动初始化,避免掩盖逻辑遗漏


















