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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© goldenking56 初级黑马   /  2012-3-8 22:07  /  2806 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 goldenking56 于 2012-3-8 22:53 编辑

JDK帮助文档中写的是Iterator是个接口,它有三个方法,hasNext(),next()和remove()三个方法,但是,在接口中方法是不能被实现的。当我们ArrayList al = new ArrayList();al.iterator();可以返回在al上的迭代器;然后此迭代器就可以调用Iterator中得三个方法了。可是这三个方法在什么地方被重写了啊。为什么就可以直接调用呢??


迷惑中,求高手指点迷津!!!



大家看看,我这样理解对不对:实际上al.iterrator();运行后返回的是,java.beans.beancontext.BeanContextSupport.BCSIterator,这个类的一个实例对象,也就是所谓的迭代器;由于对象的多态性,所以可以:Iterator it = al.iterator();并且调用:it.hasNext();it.next();

不知道这样理解对吗,请大家指正!

11 个回复

倒序浏览
你所说的反向下就对了,正是ArrayList本身就实现迭代器这个接口类,也就是他复写实现了这3个方法
回复 使用道具 举报
本帖最后由 马胜平 于 2012-3-8 22:32 编辑

itrator方法返回Itrator对象
回复 使用道具 举报
马胜平 发表于 2012-3-8 22:28
itrator方法返回Itrator对象

方法是写在接口里的,没有具体的类去实现,为什么能调用呢
回复 使用道具 举报
有具体的类实现,刚翻了半天源码,原来还真没注意过,ArrayList 的中的hasNext()等方法是在AbstractList类中实现的
回复 使用道具 举报
本帖最后由 马胜平 于 2012-3-8 22:56 编辑

你看API中有Collection集合public interface Collection<E>extends Iterable<E>该集合继承了Iterable接口,该接口有一个itrator方法该方法返回一个Itertor类型的对象,所有实现了该接口的集合类都实现了该方法。所以集合里实现了的itrator方法是Iterable接口里的方法返回一个对象类型确实Iterator。
回复 使用道具 举报
彭卫红 2012-3-8 22:58:44
7#
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
杨毅 黑马帝 2012-3-8 23:09:31
8#
整个过程是这样子的,al.iterrator()调用后运行返回的是 Itr 对象 ,而这个class  Itr  是实现了Iterator 接口并覆写了 hasNext(),next(),和remove()三个方法的,这个类写在AbstractList 里,有兴趣可以去看源码
回复 使用道具 举报
彭卫红 发表于 2012-3-8 22:58
对应的Iterator接口是在ArrayList里实现的。jdk源代码:
public class ArrayList extends AbstractList
Abs ...

主要是al.hasNext() al.next() 等方法定义在接口里,没有被实现,既然没实现又如何能调用呢?
回复 使用道具 举报
彭卫红 2012-3-8 23:27:56
10#
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
杨毅 黑马帝 2012-3-8 23:30:29
11#
goldenking56 发表于 2012-3-8 23:20
主要是al.hasNext() al.next() 等方法定义在接口里,没有被实现,既然没实现又如何能调用呢? ...

已经在 ArrayList 的父类  AbstractList 类里实现了
回复 使用道具 举报
public Iterator<E> iterator()返回以正确顺序在此列表的元素上进行迭代的迭代器。
此实现返回 iterator 接口的一个直接实现,具体取决于底层 list 的 size()、get(int) 和 remove(int) 方法
他的实现是根据具体的集合而在底层定义的,谁也没有说返回的是Iterator接口的对象,他没有创建过对象,只是用接口的引用来接收子类实例,
而这正是迭代器的优点之一,他不用关心具体的是哪一个集合的迭代器实例,都可以用接口引用接收,从而可以实现结构分层,比如定义一个参数为Iterator的打印方法,谁都可以用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马