黑马程序员技术交流社区

标题: 半夜遇疑问,真没搞懂,看我的代码,关于集合问题 [打印本页]

作者: 337091921    时间: 2013-5-13 02:02
标题: 半夜遇疑问,真没搞懂,看我的代码,关于集合问题
本帖最后由 337091921 于 2013-5-13 20:48 编辑

import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;


@SuppressWarnings("unused")
class Java {

        public static void main(String[] args) {
                Person p=new Person("唐明雨",33);
                ArrayList li=new ArrayList();
                  li.add(p);
                  Iterator it=li.iterator();
                  while(it.hasNext()){
Person p1=(Person)it.next();
                            /*为什么要加这一步呢,直接写System.out.println(it.next()+p1.getName()+p1.getAge()); 不可以吗,是不是当add里的参数为对象时,都要跌加时,在强转,为什么呢?*/
System.out.println(p1.getName()+p1.getAge());
                          
                          
                  }
                        
                        
                        
               
        }
}
class Person {

        String name;
        int age;
        
        
        
        public String getName(){
               
               
               
                return name;
        }
        public int getAge(){
               
               
               
                return age;
        }
        public Person(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }
        public Person() {
                super();
        }
        
}


作者: 钟林杰    时间: 2013-5-13 03:43
Person p1=(Person)it.next();加上这一步是方便你在下面的程序中需要使用现在这个it.next()返回的对象中的方法或数据,因为next()方法里面有累加器,每次调用之后都会改变返回的对象,所以以上这一步你必须加上。如果不加上你的程序就需要写出it.next().getName()+it.next().getAge();这样你的数据就会出错,因为这句语句中的it.next().getName()和it.next().getAge()他们两个使用的对象都不同。如果迭代的时候只需要打印它的name或age其中一个,这时你就可以不用加上这一步:Person p1=(Person)it.next()。
作者: 飞鸟青崖    时间: 2013-5-13 08:05
直接把两句合成:System.out.println(it.next()+p1.getName()+p1.getAge());是不行的,因为p1你没有进行声明。
如果不要强转,直接写成:
Person p1 = it.next();
System.out.println(p1.getName()+p1.getAge());
这样写也不行,虽然对p1进行了声明,但是由于没有使用泛型,it.next()返回的对象是Object的,
所以Person p1 = it.next();相当于用一个Person的引用指向了Object的对象。不行。
如果你想不进行强制的话,可以使用泛型,代码如下:
  1. public static void main(String[] args)
  2.         {
  3.         Person p=new Person("唐明雨",33);
  4.         ArrayList<Person> li=new ArrayList<Person>();//集合中加上泛型
  5.         li.add(p);
  6.         Iterator<Person> it=li.iterator();//迭代器上一定也要声明泛型,不然还得强制。
  7.         while(it.hasNext())
  8.                 {
  9.                          Person p1=it.next();//加了泛型,这里就不需要强制了。
  10.                         System.out.println(p1.getName()+p1.getAge());
  11.         }     
  12.      }
复制代码

作者: 刘胜寒    时间: 2013-5-13 08:30
为什么要强转,是因为没有使用泛型。
ArrayList li = new ArrayList<Person>();
下面就不用强转了。。


楼主记得及时结贴。。




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