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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑庆伟 中级黑马   /  2012-7-6 11:55  /  3548 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑庆伟 于 2012-7-6 12:55 编辑

public static void method_get()
{
     ArrayList   a1 = new Arraylist();
     a1.add("java01");
     a1.add("java02");
     a1.add("java03");
     Iterator it = a1.iterator();
}
Iterator接口  为什么可以直接通过a1对象拿来使用,而不是像以前一样通过建立一个类,然后通过实现这个接口在使用?毕老师的视频没有听明白 请帮解释一下谢谢。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
这是多肽的典型应用,是接口引用指向子类的对象。他们的关系是 subClass like a interface。
回复 使用道具 举报
先看看文档中对这个方法是怎么解释的
public Iterator<E> iterator()返回以恰当顺序在此列表的元素上进行迭代的迭代器。
此实现返回 iterator 接口的一个直接实现

当然了,如果你对集合的底层代码很熟悉,你也可以自己手工覆写iterator接口。但是这又何必呢,人家给你提供了现成的iterator的实例干嘛不用呢,对吧
也许你是想问,为什么接口可以被实例化,没错,接口的确不能直接用new来实例化,如果要实例化接口就必须要覆写接口内的抽象函数。
因此,我们可以果断的猜测一下,在ArrayList类中的iterator()方法的内部一定是通过一个匿名内部类(也可能是实名的,谁知道呢,我没看过这个方法的源代码)继承了Iterator接口,并且实现了Iterator接口的所有抽象函数,最终返回了一个该匿名类的实例
而程序中,我们用方法返回的这个匿名类的实例来实例化了一个Iterator的实例,即子类为父类对象实例化,原理基本上就是这样

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
      Iterator接口也是Java集合框架的成员,但它与Collection系列以及Map系列的集合不一样:Collection系列以及Map系列的集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素.
      Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一接口.Iterator接口里定义了三个方法:
     boolean hasnext():如果被迭代的集合元素还没有被遍历,就返回true;
     Object next():返回集合里的下一个元素;
     void remove():删除集合里上一次next方法遍历的元素.
     Iterator接口仅用于遍历集合,Iterator本身并不提供盛装对象的能力.如果需要创建Iterator对象,则必须有一个被迭代的集合.没有集合的Iterator仿佛无本之木,没有存在的价值.Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象.
回复 使用道具 举报
本帖最后由 杨_扬 于 2012-7-6 12:25 编辑

我查了一下ArrayList从父类AbstracyList继承了iterator方法,在AbstracyList类中,通过一个叫做
private class Itr implements Iterator {
        ...
}
的内部类来实现了Iterator接口

iterator()方法定义为


public Iterator iterator() {


           return new Itr();


}


即返回了该内部类的一个实例
回复 使用道具 举报
iterator()我明白了是所有集合的中共有的方法。
我以前到现在一直有个疑问像ArrayList、Thread等为什么可以再随便建立的一个类中直接建立自己的子类对象呢,比如ArrayList   a1 = new Arraylist();  我知道Object是所有类的父类,那么ArrayList、Thread是Object的子类,而随便建立的一个类也是Object的子类那么,随便建立的一个类与ArrayList、Thread又有什么关系呢?我不明白
回复 使用道具 举报
iterator()我明白了是所有集合的中共有的方法。
我以前到现在一直有个疑问像ArrayList、Thread等为什么可以再随便建立的一个类中直接建立自己的子类对象呢,比如ArrayList   a1 = new Arraylist();  我知道Object是所有类的父类,那么ArrayList、Thread是Object的子类,而随便建立的一个类也是Object的子类那么,随便建立的一个类与ArrayList、Thread又有什么关系呢?我不明白
回复 使用道具 举报
我还有问题,为什么回复提示需要通过审核?
回复 使用道具 举报
我以前到现在一直有个疑问像ArrayList、Thread等为什么可以再随便建立的一个类中直接建立自己的子类对象呢,比如ArrayList   a1 = new Arraylist();  我知道Object是所有类的父类,那么ArrayList、Thread是Object的子类,而随便建立的一个类也是Object的子类那么,随便建立的一个类与ArrayList、Thread又有什么关系呢?我不明白
回复 使用道具 举报
iterator()我明白了是所有集合的共有的方法
回复 使用道具 举报
郑庆伟 发表于 2012-7-6 12:38
我以前到现在一直有个疑问像ArrayList、Thread等为什么可以再随便建立的一个类中直接建立自己的子类对象呢 ...

唯一的关系就是他们都有同一个祖宗类(不叫父类了)Object,就这么点关系
回复 使用道具 举报
我刚才回复的内容有有“中  共”两个字连在一起了, 中 共是不是不可以发表
回复 使用道具 举报
郑庆伟 发表于 2012-7-6 12:38
我以前到现在一直有个疑问像ArrayList、Thread等为什么可以再随便建立的一个类中直接建立自己的子类对象呢 ...

哦,对,毕老师的视频里叫Object类为“上帝”
这个比方好
按照圣经上说,人类是上帝创造的
你和我,咱俩都是上帝创造的人类的“子类”
你说咱俩有什么关系?
咱俩没关系,对吧?
不过现在,咱俩有关系了,你的一个方法"发帖子()"的返回值被我引用了,哈哈
回复 使用道具 举报
哦我明白了这就是为什么要在代码的第一行要写import java.util.*;的原因了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马