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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请教一下大家这段程序为何编译失败呢,我记得之前毕老师讲过的一个例子好像这样是可以打印的可是现在为何不可以呢?好像和和转型有关,请大家帮我详细解释一下谢了

class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
class ArrayListTest2
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add(new Person("lisi01",30));
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi03",33));
                al.add(new Person("lisi04",35));
               
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        sop(it.next().getName()+"...."+it.next().getAge());
                }

        }

}


结果是把
while(it.hasNext())
                {
                        sop(it.next().getName()+"...."+it.next().getAge());
                }
改成
while(it.hasNext())
                {
                        Person p=(Person)it.next();
                        sop(p.getName()+"...."+p.getAge());
                }

为何是这样的呢?没理解

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 Yuan先生 于 2013-10-25 23:08 编辑

刚写的,你参考下
  1. class ArrayListTest2 {
  2.         public static void sop(Object obj) {
  3.                 System.out.println(obj);
  4.         }

  5.         public static void main(String[] args) {
  6.                 ArrayList<Person> al = new ArrayList<Person>();
  7.                 al.add(new Person("lisi01", 30));
  8.                 al.add(new Person("lisi02", 32));
  9.                 al.add(new Person("lisi03", 33));
  10.                 al.add(new Person("lisi04", 35));

  11.                 Iterator<Person> it = al.iterator();
  12.                 while (it.hasNext()) {
  13.                         //在此处调用了两次it.next(),所以数据会出现错误
  14. //                     sop(it.next().getName() + "...." + it.next().getAge());
  15.                         Person p=(Person)it.next();
  16.                         sop(p.getName()+"...."+p.getAge());
  17.                 }
  18.         }
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
这里说一下iterator迭代器
Iterator 是一个非常有用的接口,几乎可以这么说吧,在实际应用中只要用到啦Collection接口的类都会用到iterator
这个接口,然而所有实现啦Collection接口的容器类都有一个iterator()方法,用来返回一个实现啦Iterator接口
的对象。它的作用就是对Collection的元素进行遍历操作(即把Collection中的元素按你自己想要的方式取出来).

itrator接口有如下特点:
1.迭代器是取出方式,会直接访问集合中的元素。
2迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。
3迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。
4迭代器的next方法返回值类型是Object,所以要记得类型转换。

只要抓住iterator的特点不难发现这个问题:
在调用it.next();方法是返回的object对象如果要访问
Person类的特有方法或属性需要强制转换为person对象类型
这让我们想到了多态,也可以说这是多态中出现的:向下转型
希望楼主好好琢磨,不难会发现这个特点。希望对您有帮助。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报 1 0
编译报错是因为系统默认认为你的对象是Object的,里面木有getName()和getAge(),

下面这句加上泛型就行

Iterator<Person> it = al.iterator();
回复 使用道具 举报
1961993790 发表于 2013-10-25 23:15
这里说一下iterator迭代器
Iterator 是一个非常有用的接口,几乎可以这么说吧,在实际应用中只要用到啦Coll ...

好的,谢了哥们,总结的很详细了
回复 使用道具 举报
Yuan先生 发表于 2013-10-25 23:07
刚写的,你参考下

你还是没有说出为什么会出现这个错误还有就是解决办法的理由是什么
回复 使用道具 举报
马晓平 发表于 2013-10-26 09:55
你还是没有说出为什么会出现这个错误还有就是解决办法的理由是什么

it.next().getName()--在这调用了一次it.next(),所以getName()获取到的是第一条数据,
it.next().getAge()--在这又一次调用了it.next(),所以getAge()获取的是第二条数据条
sop(it.next().getName() + "...." + it.next().getAge());这一行代码调用了两次it.next(),
而Person p=(Person)it.next();sop(p.getName()+"...."+p.getAge());只调用了一次,明白吗!!

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
Yuan先生 发表于 2013-10-26 20:37
it.next().getName()--在这调用了一次it.next(),所以getName()获取到的是第一条数据,
it.next().getAge ...

有点小懂了,嘿嘿
回复 使用道具 举报
E next()
          返回迭代的下一个元素。
返回类型相当于object;
你下面要用返回值调用Person()的方法, 当然要使用Person的对象啦。
将E强转为Person
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马