簡體   English   中英

Java中如何隱式調用對象創建或構造函數

[英]How object creation or constructors called implicitly in Java

我對Java中的static methods和對象創建感到困惑。

如我們所知,我們可以按此處的靜態方法訪問靜態成員。

public static void main(String[] args){
// only static method from outside ( without any object )
}

但是我愚蠢的問題是,為什么Java允許這樣做?

`public static void main(String[] args){
    Object o = new Object(); // is constructor implicitly static? 
                          // I'm sure no but why java allow this to call here?
    }

我知道上面的聲明類似於在靜態方法中聲明局部變量。

public static void main(String[] args){
 int a = 3;
}

但是我對構造函數並不感到困惑。

構造函數不是靜態的。 它們是在您剛剛創建的實例上調用的。 在字節碼中會發生什么。

  1. 創建了一個新對象,但是它沒有被初始化。
  2. 在該對象上調用構造函數。 在構造函數中, this是要初始化的對象。

在字節碼中,您的main()方法如下所示( javap -c Main.class命令的結果):

  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: return

如您所見,在位置0,將執行new指令。 然后,在位置4,在新創建的對象上調用構造函數。

Java虛擬機規范中也對此進行了指定:

4.10.2.4。 實例初始化方法和新創建的對象

創建一個新的類實例是一個多步驟的過程。 該聲明:

 ... new myClass(i, j, k); ... 

可以通過以下方式實現:

 ... new #1 // Allocate uninitialized space for myClass dup // Duplicate object on the operand stack iload_1 // Push i iload_2 // Push j iload_3 // Push k invokespecial #5 // Invoke myClass.<init> ... 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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