[英]When is an object declared and initialized in a local reference created in Java?
[英]When the reference to an object is created in Java?
class myClass{
public myClass(){
// INITIALIZATION
}
...
}
...
myClass a;
...
a = new myClass();
什么時候引用一個對象不再是null
? 一旦構造函數被調用或完成?
在行中a = new myClass();
有幾件事情正在發生:
new myClass();
創建新對象的實例。 a
仍然為null
。 嚴格來說,它甚至不是null
,它not initialized
狀態。=
分配a
新值,該值是指向在步驟 1 中創建的對象的鏈接所以a
只有在賦值完成后才具有正確的值。
如果你看一下字節碼,你可以看到實際的賦值發生在第 13 行。字節碼:
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: new #2 // class a$MyClass
7: dup
8: aload_0
9: aconst_null
10: invokespecial #3 // Method a$MyClass."<init>":(La;La$1;)V
13: astore_1
14: return
聲明a
在單獨的行中變量只是一個語法糖,並且對所述字節代碼沒有影響。 javac
編譯器將以與myClass a = new myClass();
相同的方式處理您的代碼myClass a = new myClass();
.
考慮以下示例,添加System.out
作為示例代碼:
myClass a;
System.out.println("b");
a = new myClass();
它產生以下字節碼( javap -v Main.class
):
Code:
stack=2, locals=2, args_size=1
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String b
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: new #21 // class myClass
11: dup
12: invokespecial #23 // Method myClass."<init>":()V
15: astore_1
16: return
在處理a
之前執行System.out
地方。
您可以通過使用static
字段在構造期間打印出對象的值來測試這一點。
class Test {
public static Test t;
public Test() {
System.out.println(t);
}
public static void main(String[] args)
{
t = new Test();
System.out.println(t);
}
}
輸出:
空值
test.Test@7852e922
輸出在構造函數內的print
顯示為null
,因為尚未分配static
對象t
,但在t = new Test()
完成后,似乎現在已分配了t
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.