黑马程序员技术交流社区

标题: 关于Iterator的一个问题 [打印本页]

作者: decadence90    时间: 2015-7-22 21:47
标题: 关于Iterator的一个问题
//Student是复写过toString方法的

public class IteratorDemo {
        public static void main(String[] args) {
                Collection c = new ArrayList();
               
                c.add(new Student("小王", 10));
               
                c.add(new Student("小李", 12));
                c.add(15);
                for (Iterator it = c.iterator(); it.hasNext();) {
                       
                        Object o = it.next();     //        在这里并没强转为Student型
                        System.out.println(o); //但是输出的确实是Student的toString()的方法
                }
        }
}

解释:
it.next()的返回值就是添加时的对象,因为一个集合可以添加不同
类型的引用类型,所以,在这里it.next()不能确定到底返回的是哪一个对象
所以只能用Object来接收.直接打印的时候就是调用的是存入该对象的toString()方法.
作者: 官沛    时间: 2015-7-22 21:57
嗯,是这样的,我今天也纠结了好一会儿
作者: 扶摇丶    时间: 2015-7-22 22:02
当时就有点难以理解
作者: T-l-H、小生    时间: 2015-7-22 22:08
你这个不就是个使用ArrayList集合存储自定义对象,并且使用迭代器遍历集合中的对象嘛?搞那么复杂干嘛?还要重写toString()方法?
直接
      Iterator it=c.Iterator();
          while(it.hasNext){
                  Student   stu=(Student)it.next();
                  s.o.p(stu.getName+stu.getAge);
           }
又或者直接在ArrayList后面加个<Student>类,在迭代器后面也直接加个<Student>,搞个泛型集合,依然使用it.next()拿到集合中的元素之后,连强转都不用,直接用Student接收了。
还有剩下普通for循环和增强版for循环遍历的方法就不说了。。。
作者: decadence90    时间: 2015-7-22 22:17
T-l-H、小生 发表于 2015-7-22 22:08
你这个不就是个使用ArrayList集合存储自定义对象,并且使用迭代器遍历集合中的对象嘛?搞那么复杂干嘛?还 ...

这个我知道啊 , 我讲的不是这个 , 是没有强转,打印值却是调用的 Student 的toString()方法
作者: 呆呆怪兽    时间: 2015-7-22 22:19
那你这里是不是可以理解为Iterator会隐式判断集合里的对象类型?
作者: decadence90    时间: 2015-7-23 07:56
在用Objece接收的那一句不会自动判断,当在输出的那一句才确定了是什么类型.




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