如果我们将 null 分配给任何对象,它实际上是堆中的某个内存位置或其他任何东西。
应该区分reference
和object
。您可以分配null
给参考。对象通常使用new
运算符在堆中创建。它返回一个对象的引用。
A a = new A();
A
在堆中创建具有类型的对象。给你回参考a
。如果你现在分配
a = null;
对象本身仍驻留在堆中,但您将无法使用 reference 访问它a
。
请注意,对象可能稍后会被垃圾收集。
升级版:
我创建了这个类来查看它的字节码(对我来说是第一次):
public class NullTest {
public static void main (String[] args) {
Object o = new Object();
o = null;
o.notifyAll();
}
}
它产生:
C:\Users\Nikolay\workspace\TestNull\bin>javap -c NullTest.class
Compiled from "NullTest.java"
public class NullTest {
public NullTest();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #3 // class java/lang/Object
3: dup
4: invokespecial #8 // Method java/lang/Object."<init>":()V
7: astore_1
8: aconst_null
9: astore_1
10: aload_1
11: invokevirtual #16 // Method java/lang/Object.notifyAll:()V
14: return
}
您可以看到将 null 设置为引用结果:
8: aconst_null
9: astore_1
字节码指令列表
基本上它将 null 的值放在堆栈的顶部,然后保存到引用。但是这种机制和参考实现是 JVM 内部的。
对java对象的引用是如何实现的?