我的问题可能是新鲜的,甚至是重复的,但我还没有找到答案。 iterator()方法返回一个迭代器,它有几个方法,比如next()。但这些方法在哪里实施?接口无法实现方法,对吧?
例如:
Set keys = selector.selectedKeys();
Iterator it = keys.iterator();
While (it.hasNext())
另外,it
不是对象的引用,对吗?那是什么?
答案 0 :(得分:4)
你是对的,接口无法实现方法。
接口编程的美妙之处在于您无需担心它们的实现位置。您需要知道的是Set#iterator()
返回一个实现Iterator
接口的类。这样,如果包含实现的返回类应该更改,这对您的代码无关紧要。
答案 1 :(得分:1)
iterator()
实际上将返回Iterator
的实现,即实现Iterator
的类的实例。通常这个类会有所不同,具体取决于您调用的集合iterator()
。
这是接口的主要优点:它们只定义了一些实现必须遵循的契约(在这种情况下,它定义了几种方法以及它们应该如何表现),但实际上并没有提供该契约的实现,因此可以在适当的位置定义实现。
答案 2 :(得分:1)
如果使用Eclipse之类的IDE,则可以查询实现Iterator
的类列表。只需在代码中选择单词Iterator
,然后按 Ctrl - t 。其他IDE将有自己的方式来做到这一点。
您将看到Oracle非公共代码(以及您使用的其他库)中包含的无数不同的迭代器。它是从集合中请求迭代器时返回的其中一个类的实例。
要找出与特定对象类型一起使用的特定迭代器,请浏览源代码并亲自查看!或者通过在迭代器实例上调用.getClass().getName()
来print the name。
例如,HashSet
使用私有迭代器类HashMap.KeyIterator
,它扩展了父类HashMap.HashIterator
。
答案 3 :(得分:0)
在您的情况下,Set keys对象是一个具体的实现,如
所有已知的实施类: AbstractSet,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,JobStateReasons,LinkedHashSet,TreeSet
他们实现了Iterable。
例如TreeSet imeplements Iterable
所有已实施的接口: Serializable,Cloneable,Iterable,Collection,NavigableSet,Set,SortedSet
答案 4 :(得分:0)
接口无法实现方法,这是对的。
但是it
是对对象的引用,特别是实现Iterator
接口的对象。
如果接口说一个方法返回一个迭代器,那么创建该接口实现的任何人都有责任提供这些方法可以返回的Iterator实现。他们可能能够在其内部数据结构上重用现有的迭代器,或者他们可能需要创建一个新的迭代器。
答案 5 :(得分:0)
将接口视为“合同”。
当你编写一个程序而你说“它是一个迭代器”时,编译器(或解释器,无论如何)“理解”的是任何声明该接口所期望的方法的东西都将被接受。这为您的程序提供了灵活性,这也是面向对象语言的全部内容。
现在,当程序需要有效执行时,解释器将开始搜索所有内部依赖项,以找出实际执行该“契约”的代码片段。这是由JAVA动态解决的。
在这种情况下,JAVA会看到“它”是“键”的迭代器。然后它还会看到“keys”是另一个接口(Set)实际上是指一个具体的Set实现(可以实际执行的一段代码),它是selector.selectedKeys()。
但是如果“selector”是另一个接口,那么JAVA将继续搜索,直到找到可以实际执行代码的人,然后事情继续进行。 : - )
答案 6 :(得分: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源代码中学习它。我希望这个答案可以帮到你。
答案 7 :(得分:0)
你应该这样接近它。
Set keys = selector.selectedKeys();
上面的语句应该像这样读,“我有一个引用键指向Set接口的一些实现。它指向的实现可以在selectedkeys()的返回类型中找到。实现可以是一个hashSet ,LinkedHashSet或任何其他实现Set的类。另外,如果你检查set接口,它会扩展集合,其中inturn扩展为iterable。所以从接口很明显,Set的任何实现都肯定会实现iterator()
Iterator it = keys.iterator();
这一行应该被理解为“调用引用键指向的实现类的迭代器方法”。因此,要获得Iterator的实现,您需要首先确定哪些键指向的实现。源代码包含这些问题的所有答案。尝试深入研究集合源代码,你会发现各种Set实现,你可以看到Iterator是如何实现的。
答案 8 :(得分:-1)