我对Java中的迭代器非常困惑。
教程正在阅读中说:
在Java编程语言中,接口是一种类似于类的引用类型,它只能包含常量,方法签名和嵌套类型。没有方法体。接口无法实例化 - 它们只能由类实现或由其他接口扩展。扩展将在本课程后面讨论。
然后我看到了另一个教程:
Iterator<String> flavoursIter = aFlavours.iterator();
我知道aFlavours已经继承了迭代器函数,它返回迭代器接口。我只是不明白这一行实际发生了什么。 我以为你无法实例化?
也许我没有意义,但请告诉我,我正在离开赛道。
答案 0 :(得分:7)
说它无法实例化,它们的意思是你无法做Iterator i = new Iterator();
。由于Iterator是一个接口,它本身没有实现。当你这样做
Iterator flavoursIter = aFlavours.iterator();
你正在做的是在aFlavours
对象上调用一个名为“iterator”的方法,该方法返回一个实现Iterator接口的类的实例(你真的不知道它究竟是什么类,也不是如果你关心,你所保证的是它支持Iterator接口中定义的所有方法。
答案 1 :(得分:1)
作为其他答案的补充:
许多类将Iterator
等接口实现为私有内部类,然后在请求实例时返回该隐藏类的实例。如果您想要一个示例,可以阅读Collections框架的源代码。
以这种方式执行操作的主要优点是隐藏了实现细节。例如,List
的用户在调用someList.iterator ()
时不必知道返回的具体类,也不需要知道Iteraor
中有多少不同的{{1}}实现可用。集合框架。这允许该框架的开发者根据他们的需求(可靠性,效率等)根据需要创建尽可能多的实现,并且作为框架的用户,您不必学习数百个类。
答案 2 :(得分:0)
您无法创建Iterator
对象,但可以创建实现Iterator
接口的对象。使用Iterator flavoursIter
意味着您不关心哪种实现。
答案 3 :(得分:0)
你是对的。 Iterator
是interface
,因此无法直接实例化。但是,您可以创建并实例化Iterator
类的实现。
基本上,具有iterator()
方法的类已经编写了自己的Iterator
接口实现。 iterator()
实例化并返回Iterator
。
答案 4 :(得分:0)
踢, 当我们调用方法iterator()时,它将返回Iterator的实例。例如
public Iterator iterator() {
return new ArryListIterator implments Iterator {
public T next() { // code for next() }
public boolean hasNext() {//code for hashNext()}
//others codes
}
}
所以。你知道我们打电话的时候发生了什么。