2011-11-23 47 views
2

我知道在初始化一個類變量時,Java會讓你用變量的類型做欺騙。沿着線:這個語法叫什麼? `new Type(){...}`

SomeType foo = new SomeType() { 
    { 
     this.fooField = 12345; 
    } 
    @Override public void someMethod() { 
     throw new ReallyWeirdException(); 
    } 
}; 

這將創造可變foo一個實例,其中someMethod()具有不同的語義比通常SomeType,並且其中fooField初始化爲比其正常的默認以外的值。

但是什麼是new Type() { ... }語法調用?

回答

3

匿名內部類。

您在代碼(內部)中定義了一個沒有名稱(匿名)但繼承自SomeType的類(class),然後重寫它的一些方法和屬性。

+0

啊,對了,謝謝!當你知道你在找什麼時,更容易閱讀它。 :-) –

0

我會稱這是一個匿名(子)類。

注意,你在這裏做兩件事情 - 壓倒一切的someMethod在您的匿名子類,並且還增加了一個實例初始化(這是設置fooField到一個新的值)

+0

是的,我知道它正在做兩件事。初始化塊有時很有用。 (雖然我現在意識到,爲了這個例子的目的,我可能應該省略其中的一個。) –

2

你有

  1. 匿名類()和
  2. 初始化塊(用於fooField)。
2

匿名內部類。

new SuperType(construction parameters) { 
    inner class methods and data 
} 

這裏,SuperType可以是一個接口,如ActionListener;然後,內部類實現該接口。或者SuperType可以是一個類;那麼,內部類就擴展了這個類。

匿名內部類不能有構造函數,因爲構造函數的名稱必須與類的名稱相同,並且該類沒有名稱。相反,構造參數被賦予超類的構造函數。特別是,每當內部類實現一個接口時,它就不能有任何構造參數。不過,你必須提供一組圓括號,如

new InterfaceType() { methods and data }