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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© decadence90 中级黑马   /  2015-7-22 21:47  /  582 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//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()方法.

6 个回复

倒序浏览
嗯,是这样的,我今天也纠结了好一会儿
回复 使用道具 举报
当时就有点难以理解
回复 使用道具 举报
你这个不就是个使用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循环遍历的方法就不说了。。。
回复 使用道具 举报
T-l-H、小生 发表于 2015-7-22 22:08
你这个不就是个使用ArrayList集合存储自定义对象,并且使用迭代器遍历集合中的对象嘛?搞那么复杂干嘛?还 ...

这个我知道啊 , 我讲的不是这个 , 是没有强转,打印值却是调用的 Student 的toString()方法
回复 使用道具 举报
那你这里是不是可以理解为Iterator会隐式判断集合里的对象类型?
回复 使用道具 举报
在用Objece接收的那一句不会自动判断,当在输出的那一句才确定了是什么类型.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马