2012-03-15 37 views
2

爲什麼該方法以'return new'開頭?java方法聲明開始於:'return new'(關於匿名類的混淆)

public Iterator<T> iterator() { 
    return new Iterator<T>() { 
     ... 
    } 
} 
+0

這是一樣的迭代變量用「新」,後來分配回。 – darijan 2012-03-15 17:17:44

+0

你似乎認爲它是返回新的(....)。它實際上是返回(新的...); – Thomas 2012-03-15 17:17:46

+0

當然,但爲什麼不在方法裏面有這個return語句? – jollyroger 2012-03-15 17:17:59

回答

3

iterator()返回Iterator<T>類型,所以該方法應當具有return聲明隨後Iterator<T>類型的一個對象的方法。

new Iterator<T>() { 
    ... 
} 

這是一個匿名類,您可以在該匿名類中實現所有抽象方法的實例化接口實例。閱讀更多關於Anonymous classes

+1

感謝您指點我正確的方向。 – jollyroger 2012-03-15 17:22:58

4

這會創建該類的一個實例(事實上,它將創建類的子類,因爲@biziclop已被挑選)並返回它。這通常是在「工廠」之類的類別中,沿着這些線路:

public static Button createButton(int x, int y, String label){ 
    return new Button(x,y,label){ 
     void onClick(){ 
      ... 
     } 
    } 
} 

/* .... */ 
Button b = Toolkit.createButton(20,20,"Hello!"); 
+3

我知道這是挑剔的,但它創建了**類的子類**,然後是該類的一個實例並返回它。這個區別很重要,因爲你可以(並且確實經常會)用抽象類和接口來做到這一點。 (在後一種情況下,它創建了一個實現,但這是挑剔++)。 – biziclop 2012-03-15 17:22:58

+0

@biziclop大聲笑,但感謝您的挑剔。我會編輯答案。 – ApprenticeHacker 2012-03-15 18:10:59

2

你看到的是一個方法,public Iterator<T> iterator(),它返回一個新的匿名內部類的實例,而不是一個方法。如果你以前從未見過匿名的內部類,混淆是可以理解的。

Here's a little info on anonymous classes in Java.