2011-09-07 79 views
1

我可以在幾個例子在網頁上看到一個新的語法對我來說,這裏是一個例子:理解語法

Accumulator<Integer> sum = new Accumulator<Integer>(){ 
    public Integer accumulate(Integer t1, Integer t2) { 
    return t1+t2; 
    } 
    }; 

在一般情況下,這是什麼意思,當一個製作的實例後寫道{ a method }一類?這是某種古老的語法嗎?

謝謝

+2

這是一個*匿名的內部類*。看到[這個答案](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java)的更多細節。 –

回答

5

您正在創建一個匿名內部類。

new Accumulator<Integer>() { 
    @Override 
    public Integer accumulate(Integer t1, Integer t2) { 
     return t1 + t2; 
    } 
}; 

定義了Accumulator的匿名實現。然後,您繼續將此匿名類的參考分配到sum

認爲它是同時定義和分配實現的便捷方式。這是一個syntactic sugar

+0

它是否從我們剛纔實例化的類擴展而來? – Numerator

+0

2-Accumulator是一個接口,所以它就像我們實例化一個接口,但並不是真的 - 因爲我們定義了一個Anonymous類,我們沒有命名,因爲它是Anonymous,並且這個新實例將只具有我擁有的能力只是在這個類中定義?謝謝! – Numerator

+2

@Sahil:擴展具體類型的匿名類是完全合法的,並且經常在Swing程序中使用,例如(匿名MouseAdapter,KeyAdapters等) –

2

不,這是一個匿名的內部類。它具有它的類型的接口或類的簽名,但可以覆蓋公共方法。

1

這是一個常用的匿名內部類。

報價「匿名類本質上是一個沒有名字的本地類」。

1

它要麼使用重載方法創建匿名子類,要麼使用匿名接口實現(取決於Accululator是類還是接口)。

2

這被稱爲匿名內部類,即沒有名稱的類,因此可以與其唯一的一個實例一起創建。當需要實現某個接口並且只需要這種實現的一個實例時,這是減少項目中可見類的數量的方法。

但不要濫用此功能。只有在實現很簡單時才使用它(1-2行)。