黑马程序员技术交流社区

标题: 用迭代器的Next()方法调用自定义对象特有方法时出错的原因 [打印本页]

作者: 为梦而战    时间: 2011-12-20 00:50
标题: 用迭代器的Next()方法调用自定义对象特有方法时出错的原因
本帖最后由 为梦而战 于 2011-12-20 00:59 编辑

       当我们使用ArrayList的add();方法将自定义对象加入ArrayList时,应该注意到add(Object obj);方法中参数是Object类型的,所以这时自定义对象就会被上升,转换成Object类型,而当我们定义了迭代器,用迭代器的Next()调用自定义对象的特有方法时,因为此时用Next();方法取出来的对象是Object类型的,Object类中没有自定义对象的特有方法可被调用,所以就出错了。我们应该在使用Next();方法之前先将用Next()取出来的对象降级转换成自定义类,然后再用自定义对象去调用它自己特有的方法、其实这也是多态在此处的体现。
示例:
public static void main(String[] args)
{
       ArrayList a1=new ArrayList();
    a1.add(new Person("zhangsan",25));     // 使用ArrayList的方法add();将自定义对象存入ArrayList。
                                       
    Iterator it=a1.iterator();     
       while(it.hasNext())
       {
               sop(it.Next().getName());     //我们可能会像输出方法中这样调用Person对象中的特有方法getName(),会错。
         Person  p=(Person)it.next();   //这一步才是正确的和必须的
         sop(p.getName());                 //这样调用才是正确的
    }
}
作者: 刘基军    时间: 2011-12-20 09:20
使用集合时,应该加上泛型,这样就不会发生那样的问题。
  ArrayList<Person> a = new ArrayList<Person>();
  1. import java.util.*;
  2. class Person
  3. {
  4.         String name;
  5.         int age;
  6.         Person(String s,int i)
  7.         {
  8.                         this.name=s;
  9.                         this.age=i;
  10.         }       
  11.         String getName()
  12.         {
  13.                 return name;       
  14.         }
  15. }
  16. class Test
  17. {
  18.   public static void main(String[] args)
  19.   {
  20.                 ArrayList<Person> a = new ArrayList<Person>();
  21.                 a.add(new Person("zhangsan",25));                                             
  22.                 Iterator<Person>  it=a.iterator();     
  23.                 while(it.hasNext())
  24.                 {
  25.                  sop(it.next().getName());
  26.                 }

  27.   }
  28.         public static void sop(Object obj)
  29.         {
  30.                 System.out.println(obj);       
  31.         }
  32. }
复制代码

作者: 张冬冬    时间: 2011-12-20 09:27
嗯、是要加上泛型的,这样就不用强转了,这个1.5的新特性




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