如何解决如果“ Iterator”是一个接口,如何创建“ Iterator”的对象?
所以,只有几天的时间,我接触了集合类,偶然发现了一个叫做“迭代器”的东西。经过几次撬动和拨弄之后,我再次迷失了docs.oracle.org,在那里我了解到Iterator实际上是一个接口,但我们仍然创建它的对象。
Iterator itr = myPrecious.iterator();
“ itr”不是对象吗?还是我错过了什么?成为接口对象不是不可能吗?
那是什么特别的东西
myPrecious.iterator();
??
不是
new Iterator();
实例化一个对象?
编辑:忘记提Java是我的第一门编程语言,所以请原谅我的愚蠢。
解决方法
“ itr”不是对象吗?
这是参考。
不是不可能使对象成为接口吗?
您无法实例化接口。这里,父类型(Iterator
)引用引用了子类型的对象。
那是什么特别的东西
myPrecious.iterator();
??
这里iterator
是类中的函数,其对象为myPrecious
。检查函数的定义,以iterator
here为例。
不是
new Iterator();
实例化一个对象?
您可以使用关键字new
实例化非抽象类。您可以通过在接口名称上使用new
来实例化一个匿名类,如here所示。
接口的要点是:
- 您不能直接创建接口的实例,对象。
- 一个类可以实现接口。它声明它实现了该接口,并且包含了该接口包含的所有方法(除非它是一个抽象类,但是再次您不能从中创建对象,所以让我们暂时忘记这种情况)。
- 您可以将对实例(对象)的引用分配给声明为具有接口类型的变量(或参数)。
所以回答您的问题:
Iterator itr = myPrecious.iterator();
“ itr”不是对象吗? …
myPrecious.iterator()
返回实际对象,并将对该对象的引用存储到itr
中。该对象可能属于我们从未听说过且不需要关心的某个类。我们所知道的是该类实现了Iterator
接口。这意味着我们可以使用该接口指定的迭代器。
不是
new Iterator();
实例化一个对象?
好问题。答:最后是。但是,在现实世界的编程中,我们经常调用普通方法来获取新对象。该方法必须依次使用new
。或调用另一个使用new
的方法(等)。这就是事情顺利进行的地方:由于我们不知道对象的实际类,因此我们无法自己使用new
。但是myPrecious
(您的集合对象)确实知道用于实例化迭代器对象的类,因此它可以为我们使用new
。并将创建的迭代器对象返回给我们。
一种检查方法是通过这个小小的代码实验:
List<String> myList = new ArrayList<>();
Iterator itr = myList.iterator();
System.out.println(itr.getClass());
在我的Java 11上,它会打印:
java.util.ArrayList $ Itr类
其他Java版本上的输出可能不同。您会注意到,输出中没有提到Iterator
接口作为迭代器对象的类,而是提到了一些ArrayList$Itr
。这意味着在Itr
类内声明了一个名为ArrayList
的类。是的,迭代器实际上是属于一个类的对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。