我正在研究Java类和继承,我对接口有疑问。
LinkedList类根据Oracle文档实现Serializable,Cloneable,Iterable,Collection,Deque,List,Queue。
因为Iterable是一个接口而不是像LinkedList这样的类,所以它必须实现了一个默认的迭代器,不是吗? 如果理解正确,我在哪里可以看到实施?
答案 0 :(得分:3)
因为Iterable是一个接口,而不是像LinkedList这样的类 必须实现默认迭代器,不是吗?
不是真的,如果超类确实覆盖了该方法,那么子类不必...
看看这个:
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>
答案 1 :(得分:1)
简短的回答是,在源代码中。
答案越长,LinkedList
本身不需要实现iterator()
方法,如果它继承自可能实现它的另一个类。如果仔细观察javadoc for LinkedList,您可以看到LinkedList没有定义iterator()
方法,但是当您实现Iterable
时,它应该在那里。查看结尾,您还可以看到继承方法的部分。具体来看&#34;从类java.util.AbstractSequentialList&#34;继承的方法,其中列出了iterator()
。
现在我们确定iterator
实际上在java.util.AbstractSequentialList
。因此,要查找实现,您可以查看AbstractSequentialList
的{{3}}:
public Iterator<E> iterator() {
return listIterator();
}
现在您看到实现取决于listIterator()
的实现。 LinkedList
没有实现listIterator()
方法(它有一个带有一个参数,但这需要无参数方法)。因此,再次查看javadoc,我们可以在&#34;下继承自类java.util.AbstractList&#34; listIterator()
方法是从那里继承的。所以查看AbstractList
中的source code:
public ListIterator<E> listIterator() {
return listIterator(0);
}
现在,listIterator(int)
类已在LinkedList
类中实现。来自LinkedList
的{{3}}:
public ListIterator<E> [More ...] listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}
如果您需要进一步分析它的作用,您可以从那里继续。
答案 2 :(得分:0)
您将在Linked List类本身中找到可迭代接口方法的实现。
答案 3 :(得分:0)
所以LinkedList类扩展了AbstractSequentialList类。这个类有一个被称为迭代器的方法。由于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{
}