1️⃣ null
的本质:空盒子理论
想象你有一个快递柜,每个格子可以放一个包裹(对象):
-
**
null
就像是一个空格子** 🚪- 格子存在,但里面没放任何包裹
- 如果你对着空格子喊:"给我包裹里的东西!" —— 系统会崩溃(
NullPointerException
)
-
关键特点:
- 不是对象,而是"无对象"的特殊值
- 所有引用类型变量(如
String s
、Person p
)默认都是null
- 就像"此人暂无联系方式"的备注
2️⃣ 引用的本质:遥控器理论
想象你有一个电视遥控器:
-
引用变量 = 遥控器 📱
TV myTV = new TV();
→ 你造了台新电视,遥控器配对它myTV.changeChannel(5);
→ 用遥控器操作电视
-
关键特点:
- 引用存储的是对象的"内存地址"(像遥控器的信号频率)
- 多个引用可以指向同一个对象(就像多个遥控器控制同一台电视)
myTV = null;
→ 把遥控器重置,不再控制任何电
// 情景1:创建对象
String food = new String("蛋糕"); // 造了个蛋糕,food遥控器指向它
String snack = food; // snack也指向同一个蛋糕
// 情景2:null操作
food = null; // food遥控器解除绑定
System.out.println(snack); // 输出"蛋糕"(snack仍指向蛋糕)
System.out.println(food.length()); // 报错!用空遥控器操作
内存图解
栈内存(遥控器) 堆内存(真实对象)
┌──────────┐ ┌──────────────┐
│ food │ ───X │ "蛋糕" │
│ (null) │ └──────────────┘
│ │
│ snack │ ───────▶│ "蛋糕" │
└──────────┘ └──────────────┘
(food 断开连接后,snack 仍控制着原来的蛋糕)
5️⃣ 必须记住的规则
null
是引用变量的默认值- 对
null
调用方法/属性 →NullPointerException
- 引用传递的是地址(不是对象本身),类似"共享遥控器"
💡 小测试
String s1 = "hello";
String s2 = null;
s2 = s1;
s1 = null;
System.out.println(s2); // 输出什么?
答案:"hello"
(s2 仍然指着原来的字符串)