簡體   English   中英

當在 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(); 有幾件事情正在發生:

  1. new myClass(); 創建新對象的實例。 a仍然為null 嚴格來說,它甚至不是null ,它not initialized狀態。
  2. 賦值運算符=分配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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM