nullを任意のオブジェクトに割り当てると、実際にはヒープ内のメモリ位置またはその他の場所になります。
とを区別する必要がreference
ありobject
ます。参照に割り当てることができnull
ます。オブジェクトは通常、new
演算子を使用してヒープ内に作成されます。オブジェクトへの参照を返します。
A a = new A();
タイプを持つオブジェクトA
はヒープ内に作成されます。参照が返されますa
。今あなたが割り当てる場合
a = null;
オブジェクト自体はまだヒープ内にありますが、参照を使用してオブジェクトにアクセスすることはできませんa
。
オブジェクトは後でガベージコレクションされる可能性があることに注意してください。
UPD:
このクラスを作成して、そのバイトコードを確認しました(初めて):
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オブジェクトへの参照はどのように実装されていますか?