A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Charay 中级黑马   /  2014-12-30 00:15  /  1410 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:既然 Iterator是一个接口,按理说接口里面的方法都是抽象方法,我们知道抽象方法是没有方法体的,也就是说抽象的方法的功能是不明确的,但是从经常用hasNext()方法和nextx()方法可知,这些方法是有特定的功能的,这些方法到底是如何实现的,为什么我们能够调用?求大神解惑

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

2 个回复

倒序浏览
Iterator是集合的一种遍历方式。因为具体的集合不同,所采用的的数据排列方式就会不同,遍历的方式就会不一样。所以Iterator只定义成一个接口。拿ArrayList的Iterator举例,查看源码:
  1. public interface Iterator
  2.         {
  3.                 public abstract boolean hasNext();
  4.                 public abstract Object next();
  5.         }

  6.         public interface Collection
  7.         {
  8.                 public abstract Iterator iterator();
  9.         }
  10.         
  11.         public interface List extends Collection
  12.         {
  13.                 ...
  14.         }
  15.         
  16.         public class ArrayList implements List
  17.         {
  18.                 public Iterator iterator() {
  19.                         return new Itr();
  20.                 }

  21.                 private class Itr implements Iterator {
  22.                         public boolean hasNext() {
  23.                                 return xxx;
  24.                         }

  25.                         public E next() {
  26.                                 return xxx;
  27.                         }
  28.                 }
  29.         }
复制代码

其中...和xxx省略了代码中具体内容,不影响阅读就好。
可以看出,Iterator it = c.iterator();   是把Itr对象返回来了,而Itr已经实现了Iterator接口,这里是多态的表现。也表明了,虽然每种集合的数据结构不同,但都根据自己的特点,底层实现了Iterator,所以集合都可以用Iterator来进行遍历。
回复 使用道具 举报 1 0
杨佳名 发表于 2014-12-30 01:10
Iterator是集合的一种遍历方式。因为具体的集合不同,所采用的的数据排列方式就会不同,遍历的方式就会不一 ...

嗯嗯,非常感谢,我已经明白了,Iterator接口里面的hasNext()和next()方法是抽象的没有任何问题,只是在对特定的实现类集合(ArrayList,LinkedList……)进行迭代遍历的时候,这个特定的类已经在自己的内部用内部类的方式实现了Iterator接口中的这两个方法,而没有对外暴露细节,我们创建集合对象的时候,有时用的是多态的形式,实际上new出来的任然是一个实现类对象,这个对象调用自己内部实现的方法也就理所应当了。我这样理解没错吧?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马