2015-01-07 176 views
-1

是什麼下面的代碼實際上做?Java類初始化

MyClass desc = new MyClass(){ 
      { 
       setName("A"); 
       setAge(20); 
      } 
     }; 

它只是創建MyClass實例,然後調用它的內部方法嗎?

我有一種感覺,它更多的東西,比如,創建一個稱爲初始化塊的方法的匿名類。

任何人都可以提供解釋?

+0

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html – Maroun

回答

1

此代碼創建一個匿名子類的MyClass的一個實例。它包含一個實例初始化塊,在實例創建時執行。

它等同於:

public class SubClass extends MyClass 
{ 
    { 
     setName("A"); 
     setAge(20); 
    } 
} 

MyClass desc = new SubClass(); 

(除了事實是,這裏的子類不是匿名的)。

而這個代碼就相當於:

public class SubClass extends MyClass 
{ 
    public SubClass() 
    { 
     super(); 
     setName("A"); 
     setAge(20); 
    } 
} 

MyClass desc = new SubClass(); 

因爲實例初始化塊被複制到類的每個構造的開始。

1

它只是創建MyClass實例,然後調用其上的內部方法 ?

實例初始化塊用於初始化實例數據成員。

{ 
    setName("A"); 
    setAge(20); 
} 

關於初始化塊和構造函數的執行順序有一定的規則。讓我們先列出它們並通過編寫一個簡單的程序進行驗證。

Initialization blocks run in the order they appear in the program. 
Instance initialization blocks run whenever a new instance of class is created. 

read more