【发布时间】:2019-11-19 11:03:24
【问题描述】:
将这些视为对象:
Iterator<String> j = LinkedList.iterator();
查看java文档,对于LinkedList类,LinkedList类中没有迭代器方法的实现,但是,实现在AbstractSequentialList类中。
public Iterator<E> iterator() {
return listIterator();
listIterator() 方法在 AbstractList 类中实现,该类是 AbstractSequentialList 的父类,如果我没记错的话,它返回一个不使用节点概念的迭代器对象。
public ListIterator<E> listIterator() {
return listIterator(0);
}
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
但是listIterator(int index)方法是在LinkedList类中实现的,并且使用了节点的概念。
public ListIterator<E> listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}
private class ListItr implements ListIterator<E> {
private Node<E> lastReturned;
private Node<E> next;
private int nextIndex;
private int expectedModCount = modCount;
那么回到j,它是来自“根”类AbstractList的迭代器还是使用了实现LinkedList类?
【问题讨论】:
-
好吧,你应该再看看多态性和方法覆盖的概念。
iterator()的基本实现将调用listIterator(),而后者又调用listIterator(0)。因此,如果LinkedList覆盖了最后一个方法,则在LinkedList上调用iterator()将调用覆盖的方法,因此将返回LinkedList.ListItr。 -
ListItr implements ListIterator<E>我会推荐composition而不是inheritence -
@Thomas 哦,好吧,我现在明白了。我虽然覆盖方法的唯一方法是使用覆盖注释。
-
@HynekHrabík 作为注解
@Override对JVM 执行代码的方式没有影响。直到第六版(即第七版)才添加它。 -
@Override更多地是向开发人员或编译器提供的信息,即方法意味着覆盖(并且从 Java 6 开始实现)方法。这样,如果在实际上没有覆盖/实现任何东西的方法上存在该注释(或者如果启用,则该注释丢失),编译器可以抱怨。这有助于开发人员更快地发现错误,因为一个方法可能看起来会覆盖另一个方法,但实际上并没有出于各种可能的原因。