核心答案
在Java中,String是引用类型,而不是基本数据类型,它的默认值是 null。

详细解释
为什么是 null?
Java中的变量分为两种:
-
基本数据类型:如
int,double,char,boolean等,它们在内存中直接存储值。int的默认值是0。double的默认值是0。boolean的默认值是false。char的默认值是'\u0000'(空字符)。
-
引用数据类型:如所有类(包括
String)、接口、数组等,它们在内存中存储的是一个对象的地址(引用),而不是对象本身。- 当一个引用类型变量被声明但没有被初始化时,它不会指向任何有效的对象,为了表示这种“不指向任何对象”的状态,Java使用关键字
null作为其默认值。 null的字面意思就是“空”,表示该引用不指向任何内存地址。
- 当一个引用类型变量被声明但没有被初始化时,它不会指向任何有效的对象,为了表示这种“不指向任何对象”的状态,Java使用关键字
在什么情况下会出现默认值?
String 的默认值 null 主要出现在以下场景:

类的成员变量
当一个类被实例化时,它声明的所有成员变量如果没有被显式初始化,JVM会自动为它们赋予默认值。
public class User {
private String name; // 成员变量,默认值为 null
private int age; // 成员变量,默认值为 0
public void printInfo() {
// 直接使用 name 会发生 NullPointerException
// System.out.println("Name: " + name.length()); // 报错!
// 正确的做法是先检查是否为 null
if (name != null) {
System.out.println("Name: " + name);
} else {
System.out.println("Name is not set.");
}
System.out.println("Age: " + age); // 输出 Age: 0
}
}
public class Main {
public static void main(String[] args) {
User user = new User();
user.printInfo();
}
}
// 输出:
// Name is not set.
// Age: 0
数组的元素
如果创建了一个 String 数组但没有为每个元素赋值,那么数组的每个元素都会是 null。

public class Main {
public static void main(String[] args) {
String[] names = new String[3]; // 创建一个长度为3的String数组
System.out.println(names[0]); // 输出 null
System.out.println(names[1]); // 输出 null
System.out.println(names[2]); // 输出 null
// names[0].length(); // 如果取消注释,会抛出 NullPointerException
}
}
String 的特殊性与 (空字符串)
String 有一个非常特殊的字面量: (双引号),它代表一个长度为0的空字符串。
- 是一个有效的
String对象,它在内存中确实存在,并且其长度为0。 null表示没有String对象。
这是一个非常重要的区别,混淆它们是常见的编程错误。
| 特性 | null |
(空字符串) |
|---|---|---|
| 含义 | 引用为空,不指向任何对象 | 引用一个有效的、长度为0的字符串对象 |
| 内存占用 | 仅是一个 null 引用,不占用对象内存 | 占用内存(在 Java 8+ 的 UTF-16 表示中,通常占用 2 字节) |
| 调用方法 | 任何方法调用都会抛出 NullPointerException |
可以安全地调用 String 的方法,如 .length() 返回 0, .isEmpty() 返回 true |
| 示例 | String s = null; |
String s = ""; |
public class Main {
public static void main(String[] args) {
String nullString = null;
String emptyString = "";
System.out.println("nullString == null: " + (nullString == null)); // true
System.out.println("emptyString == null: " + (emptyString == null)); // false
System.out.println("emptyString.isEmpty(): " + emptyString.isEmpty()); // true
// 以下代码会抛出异常
// int length = nullString.length();
// System.out.println(length);
}
}
- 默认值:Java
String作为引用类型,其默认值是null。 - 适用场景:主要出现在类的成员变量和数组元素未显式初始化时。
nullvs :null表示没有对象,而 表示一个内容为空但实际存在的对象,对null调用任何方法都会导致NullPointerException。- 最佳实践:为了避免
NullPointerException,在使用任何可能为null的引用(包括String)之前,最好进行显式检查(例如使用if (str != null)),现代Java也鼓励使用Optional类来更优雅地处理可能为空的值。
