【问题标题】:If "Iterator" is an interface how is it possible to create object of "Iterator"?如果“迭代器”是一个接口,如何创建“迭代器”的对象?
【发布时间】:2021-02-01 12:19:59
【问题描述】:

所以仅仅几天我就接触了集合类并偶然发现了一个叫做“迭代器”的东西。经过几次窥探和戳,​​我再次偶然发现了 docs.oracle.org,在那里我了解到 Iterator 实际上是一个接口,我们仍然创建它的对象。

Iterator itr = myPrecious.iterator();

“itr”不是对象吗?还是我错过了什么?做接口的对象不是不可能吗?

那是什么特别的东西

myPrecious.iterator();??

不是吗

new Iterator(); 实例化一个对象??

编辑:忘了提到 Javas 是我的第一门编程语言,所以请原谅我的愚蠢。

【问题讨论】:

  • 这是非常基础的java。一个类可以实现一个接口,然后这个类就可以被实例化!我建议你拿起一本关于 Java 的好书,阅读整个接口章节。
  • 如果一个类实现了一个接口,您可以创建该类的实例并通过接口引用它们:MyInterface instance = new ClassThatImplementsMyInterface();。此外,方法具有返回类型,因此您可以使用返回适当类型的对象的方法来实例化它:MyInterface instance = anotherObject.methodThatReturnsSomethingCompatibleWithMyInterface();
  • 将接口视为“看起来像”规范,将类视为“是”规范。还请考虑,如果您无法创建实现接口的对象,那么接口将没有用处,因此它们将不存在。但它们确实存在,因此您必须能够实例化实现接口的对象。相关:Liskov Substitution Principle

标签: java collections iterator


【解决方案1】:

“itr”不是对象吗??

这是一个参考。

难道不可以做一个接口的对象吗??

您不能实例化接口。这里,父类型 (Iterator) 引用正在引用子类型的对象。

那是什么特别的东西

myPrecious.iterator();??

这里iterator是类中的一个函数,其对象是myPrecious。查看函数的定义,以iterator here 为例。

不是吗

new Iterator(); 实例化一个对象??

您可以使用关键字new 实例化一个非抽象类。您可以通过在接口名称上使用new 来实例化一个匿名类,例如here

【讨论】:

    【解决方案2】:

    接口的要点是:

    1. 不能直接创建接口的实例,对象,你是对的。
    2. 一个类可以实现接口。它声明它实现了接口并且它包含了接口包含的所有方法(除非它是一个抽象类,但是你又不能从它创建对象,所以我们暂时忘记这种情况)。
    3. 您可以将对实例(对象)的引用分配给声明为具有接口类型的变量(或参数)。

    所以回答你的问题:

    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。这意味着在ArrayList 类中声明了一个名为Itr 的类。所以是的,迭代器实际上是一个属于一个类的对象。

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2018-05-20
      • 2010-10-09
      • 2016-07-24
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2018-07-14
      • 2013-02-28
      相关资源
      最近更新 更多