2014-01-29 73 views
0

我的問題可能是新手甚至是重複的,但仍然沒有找到答案。 iterator()方法返回一個迭代器,它有幾個方法,比如next()。但是這些方法在哪裏實施?接口不能實現方法,對吧?哪個類實現迭代器的Next()方法?

例如:

Set keys = selector.selectedKeys(); 
Iterator it = keys.iterator(); 
While (it.hasNext()) 

此外,it不是一個對象的引用,是嗎?之後怎麼樣了?

+0

檢查此http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html –

+0

小動作:object.iterator()。getClass()。getName()顯示你作爲實現返回的對象的實際類。如果你真的必須知道實現類來調查問題,那麼很容易找到這種方式(如果你問我,甚至比使用調試器更容易)。 – Gimby

+0

@Gimby對,不知怎的,沒有試圖做到這一點,謝謝 – StackExploded

回答

4

你是對的,接口不能實現方法。

接口編程的美妙之處在於您無需擔心它們的實現位置。所有你需要知道的是Set#iterator()返回一個實現Iterator接口的類。這樣,如果包含實現的返回類應該改變,這對你的代碼無關緊要。

-1

在短:Set<E>extends一個超接口Iterable<E>等向下傳遞從Iterable<E>

目的keys方法從而將有權訪問這些方法。

Here是鏈接到文檔。

0

在你的情況下,設置關鍵幀的對象是具體的實現像

所有已知實現類: AbstractSet,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet的,JobStateReasons,LinkedHashSet,TreeSet的

和他們實現了Iterable。

例如TreeSet imeplements可迭代

所有已實現的接口: 序列化,Cloneable的,可迭代,收集,NavigableSet,套裝,SortedSet的

1

iterator()實際上將返回一個實施Iterator ,即實現Iterator的類的一個實例。通常這個班級是不同的,這取決於你撥打iterator()的那個集合。這是接口的主要優點:它們只是定義了一些實現必須遵循的契約(在這種情況下,它定義了幾個方法以及它們應該如何表現),但實際上並沒有提供該契約的實現,所以可以在適當的位置定義實施。

0

接口不能實現方法,沒錯。

但是it對對象的引用,特別是實現Iterator接口的引用。

如果接口說一個方法返回一個迭代器,它是誰創建了接口的實現也提供了可以通過這些方法返回的Iterator的實現的責任。他們可能能夠在現有的迭代器上重用其內部數據結構,或者他們可能需要創建一個新的迭代器。

1

如果使用IDE,比如Eclipse,您可以查詢的實現Iterator類的列表。就在你的代碼選擇字Iterator,然後按Ctrl鍵 - 。其他IDE將有自己的做法。

你會看到,包括在甲骨文非公開代碼無數不同的迭代器(和其他庫使用)。它是您從集合中請求迭代器時返回的其中一個類的實例。

要找出哪個特定的迭代器與某個對象類型一起使用,請瀏覽源代碼並親自查看!或者通過在迭代器實例上調用.getClass().getName()來調用print the name

例如,HashSet使用專用迭代器類HashMap.KeyIterator,其擴展父類HashMap.HashIterator。接口的

iterator screenshot

0

看成是一個 「契約」。當你編寫一個程序並且你說「它是一個迭代器」時,編譯器(或解釋器,無論什麼)「理解」什麼是聲明該接口所期望的方法的任何東西都將被接受。這爲您的程序提供了靈活性,以及​​面嚮對象語言的全部功能。

現在,該計劃需要得到有效的執行時,解釋器將開始搜索所有的內部依賴關係,找出一段代碼將實際執行的是「合同」。這是由JAVA動態解決的。

在這種情況下,JAVA會看到「it」是「keys」的迭代器。然後,它還會看到「keys」是另一個實際引用了具體Set實現(實際可以執行的一段代碼)的另一個接口(Set),它是selector.selectedKeys()。

但是,如果「選擇」是另一個接口,那麼Java將繼續尋找,直到找到一個人,實際上可以執行代碼,並在事不勝枚舉。 :-)

0

在那些集合類的實現中,有一個實現Iterator接口的內部類。它是實現Iterator接口的所有方法的內部類。像ArrayList,它的實現中,有

private class Itr implements Iterator<E> { 
     int cursor;  // index of next element to return 
     int lastRet = -1; // index of last element returned; -1 if no such 
     int expectedModCount = modCount; 

     public boolean hasNext() { 
      return cursor != size; 
     } 

     @SuppressWarnings("unchecked") 
     public E next() { 
      checkForComodification(); 
      int i = cursor; 
      if (i >= size) 
       throw new NoSuchElementException(); 
      Object[] elementData = ArrayList.this.elementData; 
      if (i >= elementData.length) 
       throw new ConcurrentModificationException(); 
      cursor = i + 1; 
      return (E) elementData[lastRet = i]; 
     } 

     ... 
} 

你最好從jdk源代碼中學習它。我希望這個答案可以幫助你。

0

你應該這樣來接近它。

Set keys = selector.selectedKeys(); 

上面的語句應該這樣寫的,」我有一個參考鍵指向Set接口的一些實現。到可以在selectedkeys的返回類型()發現它指向的實現。該實現可以是一個hashSet,linkedHashSet或任何實現Set的其他類。此外,如果您檢查設置界面,它會擴展inturn延伸迭代的集合。因此,從界面可以很明顯看出設置的任何實施,必將實現迭代器()

Iterator it = keys.iterator(); 

此行應讀作「調用實現類,其參考鍵點的迭代方法」這麼獲得Iterator的實現,您需要首先確定哪些關鍵點指向的實現。源代碼包含了這些問題的所有答案。嘗試深入研究集合的源代碼,你會發現各種集成實現,你可以看到如何實現迭代器。