黑马程序员技术交流社区

标题: 2bu关于迭代器,你来说说…… [打印本页]

作者: 陈志强    时间: 2013-5-20 21:50
标题: 2bu关于迭代器,你来说说……
本帖最后由 陈志强 于 2013-5-27 21:43 编辑


  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;

  4. public class Demo6 {
  5. public static void main(String[] args) {
  6. Collection coll=new ArrayList();
  7. coll.add("jack");
  8. coll.add("roce");
  9. coll.add("lucy");

  10. Iterator it=coll.iterator();//问题1:collection是一个接口,那为什么接口可以调用方法呢?
  11. //接口调用这个方法,为什么还是用一个接口来接收呢?
  12. while (it.hasNext()) {
  13. String str = (String) it.next();//迭代器调用next方法,但是这个方法返回的却是Object,这个地方为什么不是所定义的类型呢?
  14. System.out.println(str);
  15. }
  16. System.out.println(coll);
  17. }
  18. }
复制代码

作者: 张洪慊    时间: 2013-5-20 22:18
问题1:
ArrayList为Collection的子类,ArrayList实现了Collection中的iterator方法->多态
问题2:
Iterator it=coll.iterator();//调用被ArrayList实现的iterator方法
                   //该方法会返回一个迭代器对象,该对象所属的类(在ArrayList中为一个内部类)实现了Iterator接口,实现了Iterator接口中的抽象方法
                 //用Iterator it接收,依然为多态   
骚年,将迭代器的原理没好好听啊~呵呵
作者: 袁梦希    时间: 2013-5-20 22:20
本帖最后由 袁梦希 于 2013-5-20 22:23 编辑

楼主你好:

其实并不是你所说的接口调用了方法,而是接口的引用调用了其方法,其实这些都是面向接口编程,多态的性质。
因为接口是对功能的扩展,所以这就是张孝祥总说的面向接口编程,也就是接口的引用指向了对应的实现类对象,这样可以用这个引用
来操作实现类里面的方法。

你的第二个问题是:迭代器调用next方法,但是这个方法返回的却是Object,这个地方为什么不是所定义的类型呢?
其实这个问题也很简单,可以这么想,因为集合中可以存入不同类型的元素,所以当你迭代的时候也可以是不同种类型。
也就是it.next()的返回值类型,如果集合加了泛型,那么迭代器的接口也得加个泛型,这样就避免的强制转换的苦恼。

   -------------------------黑马云青年为您手动解答

作者: Changer_s    时间: 2013-5-20 22:20
那为什么接口可以调用方法呢?
比如说:笔记本有usb接口吧,你插U盘,可以存储数据;插风扇可以,吹风...
那么这个接口必须要有响应插入usb的东西的方法(证明有东西插上去了,对吧?)
说远一点,然后具体的的功能(存储数据,吹风),只是继承这个接口的类把接口你们的方法进行了重写。

String str = (String) it.next();//迭代器调用next方法,但是这个方法返回的却是Object,这个地方为什么不是所定义的类型呢?
首先这个就像张孝祥老师将编译时,和运行时的问题了
分析这个it.next(),它的放回类型有可能是int ,String...
你会说前面我们定义了是String类型,但是我想问问你,你运行了代码吗?你一开始没有运行,也就是编译过程中,你是不晓
得是什么类型的返回值吧?所以编译的时候加上一个强制转换,懂?
作者: 谢孔营    时间: 2013-5-20 22:29
袁梦希 发表于 2013-5-20 22:20
楼主你好:

其实并不是你所说的接口调用了方法,而是接口的引用调用了其方法,其实这些都是面向接口编程, ...

说的真好,学习了,以前虽然会用,但对其原理还不是太清楚,现在清楚了。
作者: Miss小强    时间: 2013-5-21 00:12
//迭代器调用next方法,但是这个方法返回的却是Object,这个地方为什么不是所定义的类型呢?

请问你认为定义的类型是什么呢?是接收的类型String还是原始的类型呢?
如果要想达到你要的结果,就要加泛型咯。。。加油吧哥们。。。
作者: xiewen    时间: 2013-5-21 00:18
java 提倡面向接口编程,也就是体现了面向对象编程的多态性,子类指向父类接口的引用有利于程序的扩展性和灵活性。
java中实现多态的机制:
  父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法
                  黑马云青年为您解答

作者: 陈志强    时间: 2013-5-21 08:13
标题: RE: 关于迭代器,你来说说……
张洪慊 发表于 2013-5-20 22:18
问题1:
ArrayList为Collection的子类,ArrayList实现了Collection中的iterator方法->多态
问题2:

谢谢,学习了
作者: 陈志强    时间: 2013-5-21 08:15
标题: RE: 关于迭代器,你来说说……
袁梦希 发表于 2013-5-20 22:20
楼主你好:

其实并不是你所说的接口调用了方法,而是接口的引用调用了其方法,其实这些都是面向接口编程, ...

关于原理,有些不明白的地方,谢谢,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2