我的問題可能是新手甚至是重複的,但仍然沒有找到答案。 iterator()方法返回一個迭代器,它有幾個方法,比如next()。但是這些方法在哪裏實施?接口不能實現方法,對吧?哪個類實現迭代器的Next()方法?
例如:
Set keys = selector.selectedKeys();
Iterator it = keys.iterator();
While (it.hasNext())
此外,it
不是一個對象的引用,是嗎?之後怎麼樣了?
我的問題可能是新手甚至是重複的,但仍然沒有找到答案。 iterator()方法返回一個迭代器,它有幾個方法,比如next()。但是這些方法在哪裏實施?接口不能實現方法,對吧?哪個類實現迭代器的Next()方法?
例如:
Set keys = selector.selectedKeys();
Iterator it = keys.iterator();
While (it.hasNext())
此外,it
不是一個對象的引用,是嗎?之後怎麼樣了?
你是對的,接口不能實現方法。
接口編程的美妙之處在於您無需擔心它們的實現位置。所有你需要知道的是Set#iterator()
返回一個實現Iterator
接口的類。這樣,如果包含實現的返回類應該改變,這對你的代碼無關緊要。
在你的情況下,設置關鍵幀的對象是具體的實現像
所有已知實現類: AbstractSet,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet的,JobStateReasons,LinkedHashSet,TreeSet的
和他們實現了Iterable。
例如TreeSet imeplements可迭代
所有已實現的接口: 序列化,Cloneable的,可迭代,收集,NavigableSet,套裝,SortedSet的
iterator()
實際上將返回一個實施的Iterator
,即實現Iterator
的類的一個實例。通常這個班級是不同的,這取決於你撥打iterator()
的那個集合。這是接口的主要優點:它們只是定義了一些實現必須遵循的契約(在這種情況下,它定義了幾個方法以及它們應該如何表現),但實際上並沒有提供該契約的實現,所以可以在適當的位置定義實施。
接口不能實現方法,沒錯。
但是it
是對對象的引用,特別是實現Iterator
接口的引用。
如果接口說一個方法返回一個迭代器,它是誰創建了接口的實現也提供了可以通過這些方法返回的Iterator的實現的責任。他們可能能夠在現有的迭代器上重用其內部數據結構,或者他們可能需要創建一個新的迭代器。
如果使用IDE,比如Eclipse,您可以查詢的實現Iterator
類的列表。就在你的代碼選擇字Iterator
,然後按Ctrl鍵 - 噸。其他IDE將有自己的做法。
你會看到,包括在甲骨文非公開代碼無數不同的迭代器(和其他庫使用)。它是您從集合中請求迭代器時返回的其中一個類的實例。
要找出哪個特定的迭代器與某個對象類型一起使用,請瀏覽源代碼並親自查看!或者通過在迭代器實例上調用.getClass().getName()
來調用print the name。
例如,HashSet
使用專用迭代器類HashMap.KeyIterator
,其擴展父類HashMap.HashIterator
。接口的
看成是一個 「契約」。當你編寫一個程序並且你說「它是一個迭代器」時,編譯器(或解釋器,無論什麼)「理解」什麼是聲明該接口所期望的方法的任何東西都將被接受。這爲您的程序提供了靈活性,以及面嚮對象語言的全部功能。
現在,該計劃需要得到有效的執行時,解釋器將開始搜索所有的內部依賴關係,找出一段代碼將實際執行的是「合同」。這是由JAVA動態解決的。
在這種情況下,JAVA會看到「it」是「keys」的迭代器。然後,它還會看到「keys」是另一個實際引用了具體Set實現(實際可以執行的一段代碼)的另一個接口(Set),它是selector.selectedKeys()。
但是,如果「選擇」是另一個接口,那麼Java將繼續尋找,直到找到一個人,實際上可以執行代碼,並在事不勝枚舉。 :-)
在那些集合類的實現中,有一個實現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源代碼中學習它。我希望這個答案可以幫助你。
你應該這樣來接近它。
Set keys = selector.selectedKeys();
上面的語句應該這樣寫的,」我有一個參考鍵指向Set接口的一些實現。到可以在selectedkeys的返回類型()發現它指向的實現。該實現可以是一個hashSet,linkedHashSet或任何實現Set的其他類。此外,如果您檢查設置界面,它會擴展inturn延伸迭代的集合。因此,從界面可以很明顯看出設置的任何實施,必將實現迭代器()
Iterator it = keys.iterator();
此行應讀作「調用實現類,其參考鍵點的迭代方法」這麼獲得Iterator的實現,您需要首先確定哪些關鍵點指向的實現。源代碼包含了這些問題的所有答案。嘗試深入研究集合的源代碼,你會發現各種集成實現,你可以看到如何實現迭代器。
檢查此http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html –
小動作:object.iterator()。getClass()。getName()顯示你作爲實現返回的對象的實際類。如果你真的必須知道實現類來調查問題,那麼很容易找到這種方式(如果你問我,甚至比使用調試器更容易)。 – Gimby
@Gimby對,不知怎的,沒有試圖做到這一點,謝謝 – StackExploded