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