目录
一. Iterator 接口
例子:
二. ListIterator 接口
三. Iterable 接口
例子:
四. List 接口
五. Iterable接口 与 Iterator 接口 在 ArrayList 中 的使用
六. List 接口 与 ListIterator 接口 在 ArrayList 中 的使用
一. Iterator 接口
Iterator 接口 又叫迭代器。里面有两个抽象方法。
实现Iterator接口,必须重写这两个抽象方法。
例子:
那么,一个类A实现了Iterator接口,并重写了hasNext()和next()这两个抽象方法。Iterator a = new A(); 发生了向上转型,则,a这个Iterator类型的引用调用hasNext()和next()这两个方法,调用的是重写的。
二. ListIterator 接口
ListIterator 接口,继承 Iterator 接口,继承了hasNext(),next(),等抽象方法。当然也有自己新增的抽象方法。
实现ListIterator接口,必须重写所有的抽象方法。
三. Iterable 接口
Iterable 接口,里面有一个抽象方法iterator(),这个抽象方法的返回值类型是一个接口类型(Iterator接口),返回的是一个Iterator接口类型的对象(很大可能发生了向上转型,由原来的子类类型向上转型为父接口Iterator接口类型),即返回一个迭代器对象。
实现Iterable接口,必须重写这个抽象方法,调用iterator方法会返回一个Iterator接口类型的对象。
例子:
那么,一个类A实现了Iterable接口,并重写了iterator()这个抽象方法。类B实现了Iterator接口,重写了抽象方法hasNext()和next()。
A a = new A();则,a这个引用就可以调用iterator()这个方法。调用这个iterator方法会返回一个Iterator接口类型的对象new B()( B类型向上转型为 Iterator接口类型)。Iterator it = a.iterator(); 用引用 it 接收了,it这个Iterator类型的引用就可以调用Iterator接口中的方法,特别的,因为子类B重写了 父接口 Iterator中的hasNext()和next()方法,所以调用这些方法时调用的是重写的。(因为发生向上转型时,父类/父接口类型的引用可以访问它们特有的方法,以及子类重写的方法)
如下:
四. List 接口
List接口,里面有一个抽象方法 listIterator(),这个抽象方法的返回值类型是 ListIterator ,(这里大概率会发生向上转型,由子类类型转变为父接口 ListIterator类型)
实现List接口,必须重写所有的抽象方法,当然包括 listIterayor()这个抽象方法,调用 listIterator 方法会返回一个 ListIterator 类型的对象。
五. Iterable接口 与 Iterator 接口 在 ArrayList 中 的使用
Iterable 接口中有抽象方法 iterator()
对于ArrayList集合类来说,ArrayList类实现了Iterable接口,并且重写了接口中的iterator抽象方法。
那么ArrayList类型的引用就可以调用 iterator方法 ,会返回 new Itr()这个对象(返回值类型是Iterator,所以这里发生了向上转型,Itr类型向上转型为Iterator类型),用 Iterator类型的引用 it 接收,it这个Iterator类型的引用就可以调用Iterator接口中的方法,特别的,因为子类Itr 重写了 父接口 Iterator中的hasNext()和next()等方法,所以调用这些方法时调用的是重写的。(因为发生向上转型时,父类/父接口类型的引用可以访问它们特有的方法,以及子类重写的方法)
如下,就完成了ArrayList的遍历:
六. List 接口 与 ListIterator 接口 在 ArrayList 中 的使用
List接口中有抽象方法 listIterator()
对于ArrayList集合类来说,ArrayList类实现了List接口,并且重写了接口中的listIterator抽象方法。
那么ArrayList类型的引用就可以调用 listIterator方法 ,会返回 new ListItr()这个对象(返回值类型是ListIterator,所以这里发生了向上转型,ListItr类型向上转型为 ListIterator 类型),用 ListIterator 类型的引用 lt 接收,lt这个ListIterator类型的引用就可以调用ListIterator接口中的方法,(因为ListIterator 接口 继承 Iterator 接口,所以ListIterator 接口中也有hasNext等抽象方法)特别的,因为 Itr中重写了 hasNext()和next()等方法,而 ListItr 继承 Itr,所以ListItr 中 也该有重写的hasNext()和next()等方法,所以调用这些方法时调用的是重写的。(因为发生向上转型时,父接口类型的引用,访问的是子类中重写的方法)
如下,就完成了ArrayList的遍历:
还可以这样写: