我正在學習Java類和繼承,並且對接口有疑問。Java中的LinkedList是否實現了默認的迭代器?
LinkedList類根據Oracle文檔實現Serializable,Cloneable,Iterable,Collection,Deque,List,Queue。
因爲Iterable是一個接口而不是像LinkedList這樣的類,它必須實現了一個默認的迭代器,不是嗎? 如果明白了,那我可以在哪裏看到實施?
我正在學習Java類和繼承,並且對接口有疑問。Java中的LinkedList是否實現了默認的迭代器?
LinkedList類根據Oracle文檔實現Serializable,Cloneable,Iterable,Collection,Deque,List,Queue。
因爲Iterable是一個接口而不是像LinkedList這樣的類,它必須實現了一個默認的迭代器,不是嗎? 如果明白了,那我可以在哪裏看到實施?
簡短的回答是,在源代碼中。
較長的答案是LinkedList
本身並不需要執行iterator()
方法,如果它從另一個可能實現它的類繼承。如果你仔細看看javadoc for LinkedList,你可以看到LinkedList沒有定義iterator()
方法,但是當你執行Iterable
時,它應該在那裏。看最後你還可以看到繼承方法的部分。具體看「從類java.util.AbstractSequentialList繼承的方法」,其中列出了iterator()
。
所以現在我們已經確定iterator
實際上是java.util.AbstractSequentialList
。所以找到你可以看看AbstractSequentialList
的source code這是執行:
public Iterator<E> iterator() {
return listIterator();
}
現在你看到的實施取決於listIterator()
實施。 LinkedList
沒有實現listIterator()
方法(它有一個有一個參數,但這需要無參數方法)。因此,再次查看javadoc,我們可以在「從類java.util繼承的方法中找到」。。AbstractList中」,即listIterator()
方法是從那裏繼承所以從AbstractList
看source code:
public ListIterator<E> listIterator() {
return listIterator(0);
}
現在,listIterator(int)
方法在LinkedList
類實現從source codeLinkedList
的:
public ListIterator<E> [More ...] listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}
如果你需要進一步分析做什麼,你可以繼續從那裏。
由於可迭代是一個接口,而不是一類像LinkedList的,它 必須實施一個默認的迭代器,mustn't呢?
不是真的,如果超類不覆蓋的方法則子類不必...
看看這個:
interface IFoo {
int getFoo();
}
class A implements IFoo {
@Override
public int getFoo() {
// TODO Auto-generated method stub
return 0;
}
}
class B extends A {
// ...
}
class C extends A implements IFoo {
// ...
}
註釋如何C類編譯罰款甚至THOE(冗餘)實現的IFoo但犯規在此改變的getFoo方法(即僅可以COS C extends A
)
類的樣子:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
其中類AbstractCollection樣子:
public abstract class AbstractCollection<E> implements Collection<E> {
所以他們那裏覆蓋從方法interface Iterable<T>
那麼,它不需要實現抽象的方法。實際上,它的'AbstractSequentialList'實際上實現了'Iterator'來重定向到'ListIterator'接口(在AbstractList中實現)。 – AxelH
你會在Linked List類中找到iterable接口方法的實現本身。
好的,但也許你應該包括一些代碼,使這是一個真正的答案。 –
所以LinkedList類擴展摘要SequentialList類。這個類有被稱爲迭代器的方法。由於LinkedList擴展了AbstractSequentialList類,我們可以使用迭代器方法。
public abstract class AbstractSequentialList<E>
extends AbstractList<E>{
public Iterator<E> iterator(){
//implementation
}
}
現在LinkedList類擴展了AbstractSequentialList類。所以通過創建LinkedList類的對象,我們可以使用迭代器方法。
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable{
}
我知道你可以實現你自己的迭代器(我在大學爲一個主題做了它,但該類不是LinkedList),但是我不確定LinkedList中的默認實現,現在我 – alberto