黑马程序员技术交流社区
标题:
Iterator接口疑问
[打印本页]
作者:
Charay
时间:
2014-12-30 00:15
标题:
Iterator接口疑问
问题:既然 Iterator是一个接口,按理说接口里面的方法都是抽象方法,我们知道抽象方法是没有方法体的,也就是说抽象的方法的功能是不明确的,但是从经常用hasNext()方法和nextx()方法可知,这些方法是有特定的功能的,这些方法到底是如何实现的,为什么我们能够调用?求大神解惑
作者:
杨佳名
时间:
2014-12-30 01:10
Iterator是集合的一种遍历方式。因为具体的集合不同,所采用的的数据排列方式就会不同,遍历的方式就会不一样。所以Iterator只定义成一个接口。拿ArrayList的Iterator举例,查看源码:
public interface Iterator
{
public abstract boolean hasNext();
public abstract Object next();
}
public interface Collection
{
public abstract Iterator iterator();
}
public interface List extends Collection
{
...
}
public class ArrayList implements List
{
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {
return xxx;
}
public E next() {
return xxx;
}
}
}
复制代码
其中...和xxx省略了代码中具体内容,不影响阅读就好。
可以看出,Iterator it = c.iterator(); 是把Itr对象返回来了,而Itr已经实现了Iterator接口,这里是多态的表现。也表明了,虽然每种集合的数据结构不同,但都根据自己的特点,底层实现了Iterator,所以集合都可以用Iterator来进行遍历。
作者:
Charay
时间:
2015-1-1 00:11
杨佳名 发表于 2014-12-30 01:10
Iterator是集合的一种遍历方式。因为具体的集合不同,所采用的的数据排列方式就会不同,遍历的方式就会不一 ...
嗯嗯,非常感谢,我已经明白了,Iterator接口里面的hasNext()和next()方法是抽象的没有任何问题,只是在对特定的实现类集合(ArrayList,LinkedList……)进行迭代遍历的时候,这个特定的类已经在自己的内部用内部类的方式实现了Iterator接口中的这两个方法,而没有对外暴露细节,我们创建集合对象的时候,有时用的是多态的形式,实际上new出来的任然是一个实现类对象,这个对象调用自己内部实现的方法也就理所应当了。我这样理解没错吧?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2