null是引用类型的空值标记,非对象、不占堆内存,仅表示变量未指向任何实例;类字段默认为null,局部变量须显式初始化,否则编译报错。

null 不是初始化对象,而是将对象引用显式设为“不指向任何对象”的状态。它本身不分配内存,也不创建实例,只是让引用变量持有空值。
null 的本质:引用的“空值”而非对象
在 Java、C# 等语言中,引用类型变量(如 String、List、自定义类实例)声明后若未赋值,局部变量默认无初始值(编译不通过),而类字段会自动初始化为 null。这表示该变量当前没有关联堆内存中的任何对象——不是“指向一个空对象”,而是“根本没指向”。
例如:
- String s; 在方法内声明 → 编译报错(必须显式初始化)
- private String name; 在类中声明 → 自动被设为 null
- String s = null; 显式赋值 → 明确表达“暂无对象”
null 与内存分配无关
执行 String s = null; 时:
• 栈上为变量 s 分配了存储引用的空间(通常 4 或 8 字节);
• 堆上**没有任何对象被创建**,也**不触发 new 操作或构造函数调用**;
• null 只是一个特殊标记值,用于表示该引用当前无效。
对比 String s = new String("hello");:此时才在堆上分配字符数组和 String 对象,并把地址存入 s。
理解默认状态的关键:区分声明、初始化、实例化
- 声明(如 Person p;)→ 仅准备变量名和类型,不涉及内存或值
- 初始化(如 p = null; 或字段自动初始化)→ 给引用赋予一个确定值(即 null),完成变量就绪
- 实例化(如 p = new Person();)→ 才真正申请堆内存、调用构造器、生成对象
常见误区提醒
- null 不是对象,所以 null instanceof Object 返回 false
- 对 null 调用方法(如 s.length())会抛出 NullPointerException,因为没对象可操作
- null 可用于逻辑判断(如 if (list != null) list.add(x);),是防御性编程的基础

















