2011-11-18 67 views
5

我對Java中的迭代器非常困惑。在Java中聲明迭代器

本教程在讀這樣說:

在Java編程語言中,一個接口是一個引用類型,類似於類,它可以包含只常量,方法簽名和嵌套類型。沒有方法體。接口不能被實例化 - 它們只能由類實現或由其他接口擴展。本課稍後將討論擴展。

然後,我看到這個另一個教程:

Iterator<String> flavoursIter = aFlavours.iterator(); 

我明白aFlavours已在繼承返回的迭代器接口迭代器功能。我只是不明白這條線上究竟發生了什麼。 我以爲你不能實例化?

也許我沒有道理,但請告訴我我們要走了。

+2

它只是返回該接口的具體實現。另見http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html – BalusC

回答

7

通過說它不能實例化,他們的意思是你不能做Iterator i = new Iterator();。由於Iterator是一個接口,它本身沒有實現。當你做

Iterator flavoursIter = aFlavours.iterator(); 

你在做什麼在呼喚一個叫aFlavours對象返回一些類實現了Iterator接口的實例上的「迭代」的方法(你真的不知道什麼確切的它類是,也不應該關心,你所保證的是它支持在Iterator接口中定義的所有方法)。

+0

哇,我甚至沒有這樣想過。非常感謝! –

0

您無法創建Iterator對象,但可以創建一個實現Iterator接口的對象。使用Iterator flavoursIter意味着你不關心哪個實現。

0

你是對的。 Iteratorinterface,因此它不能直接實例化。但是,您可以創建並實例化Iterator類的實現。

實質上,具有iterator()方法的類已經編寫了他們自己的Iterator接口的實現。 iterator()實例化並返回Iterator的實現。

1

爲補充其他答案:

許多類實現諸如Iterator作爲一個私有內部類接口,然後每當請求一個實例返回隱藏的類的實例。如果你想要一個例子,你可以閱讀Collections框架的源代碼。

這樣做事情的主要優點是您可以隱藏實現細節。例如,List的用戶在調用someList.iterator()時不必知道返回的具體類是什麼,也不需要知道在Collection框架中有多少個不同的Iteraor實現可用。這允許此框架的開發人員根據他們的需要(協調性,效率等)創建儘可能多的實現,並且作爲框架的用戶,您不必學習數十萬個類。

0

踢, 當我們調用的方法迭代器()。它將返回Iterator.for例如

public Iterator iterator() { 
    return new ArryListIterator implments Iterator { 
     public T next() { // code for next() } 
     public boolean hasNext() {//code for hashNext()} 
     //others codes 

     } 

}

的情況下,讓你知道。無論發生了什麼,當我們把它叫做。