如何找到抽象方法hasNext()的实现?

时间:2016-03-23 01:57:22

标签: java oop collections interface polymorphism

我对以下与Java OOP和Java API /源代码安排相关的情况感到困惑。基于Oracle's Java 8 API,hasNext()是一个抽象方法,但我找不到hasNext()的实现位置。我读到私有内部类用于在每个Collection类中实现不同的迭代器,但是没有关于如何找到实现位置的更多信息。有些用户建议我将Java JRE 1.8源代码添加到我的Eclipse IDE中,但我只能在Iterator接口中看到boolean hasNext();被声明为抽象方法。

如下所示,迭代器obj直接使用hasNext()来实现它。但是,我被教导你需要在界面中实现抽象方法。

我的问题:
(1)如何找到抽象方法hasNext()的实现? (2)评论说我可以找到代码here。在ArrayList类中实现hasNext()的原因是什么,但是将hasNext()标记为抽象方法?以这种方式找到hasNext()实现并不直观。

    List<String> list = new ArrayList<String>();
    list.add("item-1");
    list.add("item-2");
    list.add("item-3");

    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }

4 个答案:

答案 0 :(得分:2)

您可以在代码中看到List是一个ArrayList。 ArrayList中名为 iterator()的方法将返回Iterator的实现。 Iterator的这个实现将实现 hasNext()方法。

很好奇,并且正如评论所说,您可以点击IDE中的代码(或者,如果这对您不起作用,请在调试器和步骤中设置断点)在)。阅读Java代码是解决它的一个很好的方法。

当然,您通常可以期望Java用户知道他们正在做什么,并相信您重新获得的实现是合理的,并且适合一般用途。这里需要注意的是,您还应该阅读文档。例如。来自https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

  

此类的迭代器和listIterator返回的迭代器   方法是快速失败的:如果列表在结构上被修改了   创建迭代器之后的时间,除了通过之外的任何方式   迭代器自己删除或添加方法,迭代器将抛出一个   ConcurrentModificationException的。因此,面对并发   修改,迭代器快速而干净地失败,而不是   在不确定的时间冒着任意的,非确定性的行为   在将来。

答案 1 :(得分:0)

集合上的迭代器。在Java Collections Framework中,迭代器代替了枚举。迭代器与枚举有以下两种不同: 迭代器允许调用者在迭代过程中使用定义明确的语义从基础集合中删除元素。 方法名称已得到改进。

https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

答案 2 :(得分:0)

我有同样的问题,如果 ListIterator 是只包含抽象方法的接口,哪个类负责实现这些方法。

得出结论(如果我错了,请纠正我)

ArrayList 实例方法 ListIterator 正在返回 ListItr(0) 的实例 ListItr(java.util.ArrayList.ListItr) 是实现 ListIterator 接口和抽象方法实现的类。 从技术上讲,ListIterator 可以保存它的实现类的实例。

答案 3 :(得分:-2)

next()hasNext()方法是Iterator接口的一部分。每个具体实现都将提供自己的版本。您可以查看如何为公共集合库hereArrayListIterator here中的SingletonListIterator定义它们。