2012-11-07 261 views
0

這是Java代碼片段。初始化類

class A{ 
    public A() { } 
    public A(int i) { System.out.println(i); } 
} 
class B{ 
    static A s1 = new A(1); 
    A a = new A(2); 
    public static void main(String[] args){ 
     B b = new B(); 
     A a = new A(3); 
    } 
    static A s2 = new A(4); 
} 

執行順序如下:1,4,2,3因爲類的初始化以這種方式執行。 但是如果刪除了B b = new B();對象創建,那麼這是否意味着該類不會按上述順序初始化? 最好的問候

+4

當你嘗試時發生了什麼?如果你沒有創建一個新的B實例*,那麼這意味着什麼? B是否有任何實例變量?如果您不創建B的實例,是否會創建任何B實例變量?考慮一下。 –

回答

5

如果刪除B b = new B(),那麼你的聲明爲實例變量引用(A a)不會與實例初始化new A(2)

只有靜態變量加載並在類加載時初始化。實例變量僅在實例化類時初始化。

理由是: -

A a = new A(2); 

你的上述代碼轉換爲: -

A a; 
public B() { 
    super(); 
    a = new A(2); 
} 

由編譯器。 B()是編譯器提供的默認構造函數,因爲您沒有提供自己的構造函數。如果你已經聲明瞭你自己的構造函數,那麼初始化就會被添加到你的每個構造函數中。

所以,如果你不實例化你的B類,A a不會initalized,因此構造A(int i)將不會被調用。

+6

數組聲明? –

+5

數組聲明?? – PermGenError

+0

是編輯。錯了。 –

2

如果您從主系統中刪除B b = new B(),則只會打印1,4,3

B類僅對象標記爲他們不要求一類的實例初始化它們靜態將被初始化。爲你的B類調用。

A a = new A(2); 

您需要創建該類的實例,就像您當前在您的代碼中所做的那樣。如果你刪除它A a= new A(2)將不會被調用,因此,輸出將是1,4,3