核心答案
在 Java 中,String 是一个引用类型(Reference Type),而不是基本数据类型。

对于任何成员变量(也叫实例变量或类变量),无论它是什么引用类型,其默认值都是 null。
String 类型的成员变量的默认值就是 null。
详细解释与示例
默认值 null 的含义
null 是一个特殊的字面量,表示“空”或“无对象引用”,当一个 String 变量被初始化为 null 时,意味着它不指向任何 String 对象在内存中的地址。
重要提示:试图对一个值为 null 的 String 变量调用任何方法(.length(), .toUpperCase() 等)都会抛出 NullPointerException(空指针异常)。

public class DefaultValueExample {
// 这是一个成员变量(实例变量)
String myString;
public static void main(String[] args) {
// 创建 DefaultValueExample 的实例
DefaultValueExample example = new DefaultValueExample();
// 打印成员变量的默认值
System.out.println("成员变量 myString 的默认值是: " + example.myString); // 输出: null
// 尝试调用 null 对象的方法
// example.myString.length(); // 这行代码如果取消注释,会运行时抛出 NullPointerException
}
}
不同作用域下的默认值情况
null 作为默认值的规则只适用于成员变量,对于其他作用域的变量,情况则不同。
a. 成员变量
如上所述,成员变量会被自动初始化。
- 实例变量:在创建对象时,JVM 会自动将其初始化为
null。 - 类变量(用
static修饰):在类加载时,JVM 会自动将其初始化为null。
public class ScopeExample {
// 实例变量,默认值为 null
String instanceString;
// 类变量,默认值也是 null
static String classString;
public void printDefaults() {
System.out.println("实例变量 instanceString: " + instanceString); // null
System.out.println("类变量 classString: " + ScopeExample.classString); // null
}
}
b. 局部变量
局部变量(定义在方法、构造函数或代码块内部的变量)没有默认值,Java 编译器要求你必须在使用它们之前显式地进行初始化,否则编译会报错。
public class LocalVariableExample {
public void myMethod() {
// String localString; // 编译错误!可能尚未初始化变量 localString
// System.out.println(localString);
// 正确的做法是显式初始化
String localString = "Hello, World!";
System.out.println(localString); // 输出: Hello, World!
}
}
与基本数据类型默认值的对比
为了更好地理解,我们可以看看 Java 中基本数据类型的默认值,它们与引用类型不同,会被 JVM 自动初始化为一个“零值”。

| 数据类型 | 默认值 |
|---|---|
byte |
0 |
short |
0 |
int |
0 |
long |
0L |
float |
0f |
double |
0d |
char |
'\u0000' (空字符) |
boolean |
false |
所有引用类型 (包括 String, Object, 数组等) |
null |
如何避免 NullPointerException
由于 String 的默认值是 null,这是一个常见的错误来源,以下是一些最佳实践来避免 NullPointerException:
-
显式初始化:始终为成员变量提供一个有意义的初始值,而不是依赖
null。private String name = ""; // 初始化为空字符串,而不是 null
-
使用
Objects.requireNonNull:当你需要一个非空的参数时,可以在方法开头进行检查。public void setUserName(String name) { this.name = Objects.requireNonNull(name, "用户名不能为 null"); } -
使用
String.isEmpty():检查字符串是否为空,而不是与null比较。if (myString != null && !myString.isEmpty()) { // 安全地使用 myString } -
使用
Optional<String>:从 Java 8 开始,Optional类是一个容器对象,可以包含或不包含非 null 值,它被设计用来以更明确的方式表示可能为 null 的值,从而减少NullPointerException的风险。private Optional<String> nickname = Optional.empty(); // 初始为空 Optional // 安全地获取值 String nick = nickname.orElse("默认昵称"); // nickname 为空,则返回 "默认昵称"
String是引用类型,其成员变量的默认值是null。null表示没有引用任何对象,调用其方法会抛出NullPointerException。- 局部变量没有默认值,必须显式初始化。
- 为了健壮的代码,应尽量避免依赖
null,并采取防御性编程措施。
