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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈志强 中级黑马   /  2013-5-20 21:50  /  1784 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈志强 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

8 个回复

倒序浏览
问题1:
ArrayList为Collection的子类,ArrayList实现了Collection中的iterator方法->多态
问题2:
Iterator it=coll.iterator();//调用被ArrayList实现的iterator方法
                   //该方法会返回一个迭代器对象,该对象所属的类(在ArrayList中为一个内部类)实现了Iterator接口,实现了Iterator接口中的抽象方法
                 //用Iterator it接收,依然为多态   
骚年,将迭代器的原理没好好听啊~呵呵

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 袁梦希 于 2013-5-20 22:23 编辑

楼主你好:

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

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

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

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 很给力!

查看全部评分

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

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

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
袁梦希 发表于 2013-5-20 22:20
楼主你好:

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

说的真好,学习了,以前虽然会用,但对其原理还不是太清楚,现在清楚了。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 鼓励一下

查看全部评分

回复 使用道具 举报
//迭代器调用next方法,但是这个方法返回的却是Object,这个地方为什么不是所定义的类型呢?

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

RE: 关于迭代器,你来说说……

张洪慊 发表于 2013-5-20 22:18
问题1:
ArrayList为Collection的子类,ArrayList实现了Collection中的iterator方法->多态
问题2:

谢谢,学习了
回复 使用道具 举报

RE: 关于迭代器,你来说说……

袁梦希 发表于 2013-5-20 22:20
楼主你好:

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

关于原理,有些不明白的地方,谢谢,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马