黑马程序员技术交流社区

标题: 学习ArrayList集合时,遇到小问题... [打印本页]

作者: Shimano    时间: 2014-5-22 14:07
标题: 学习ArrayList集合时,遇到小问题...
本帖最后由 Shimano 于 2014-5-24 09:42 编辑
  1. import java.util.*;
  2. class Person
  3. {
  4.         private String name;
  5.         private int age;
  6.         Person(String name, int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11.         public String getName()
  12.         {
  13.                 return name;
  14.         }
  15.         public int getAge()
  16.         {
  17.                 return age;
  18.         }
  19.         public String toString()
  20.         {
  21.                 return name+"..."+age;
  22.         }
  23. }
  24. class Question
  25. {
  26.         public static void main(String[] args)
  27.         {
  28.                 ArrayList al = new ArrayList();
  29.                
  30.                 al.add(new Person("lisi1",31));
  31.                 al.add(new Person("lisi2",32));
  32.                 al.add(new Person("lisi3",33));
  33.                 al.add(new Person("lisi4",34));
  34.                
  35.                
  36.                 sop(al.toString());//al调用的怎么是Person类中重写toString方法?
  37.                
  38.                 Iterator it = al.iterator();
  39.                
  40.                 while(it.hasNext())
  41.                 {
  42.                         
  43.                         Object obj = it.next();
  44.                         Person p = (Person)obj;
  45.                         
  46.                         sop(p.toString()+"....");
  47.                         //sop(p.getName()+"..."+p.getAge());
  48.                 }
  49.                
  50.         }

  51.         public static void sop(Object obj)
  52.         {
  53.                 System.out.println(obj);
  54.         }
  55. }
复制代码
/*打印结果:
[lisi1...31, lisi2...32, lisi3...33, lisi4...34]
lisi1...31....
lisi2...32....
lisi3...33....
lisi4...34....
*/
我在Person类中重写Object类的toString方法,在迭代过程中向下转型,
p调用toString方法打印出name和age。

我在迭代之前,用al调用toString方法,依照打印结果来看,
al也是调用的Person类中的toString方法,这是为什么?

al应该调用ArrayList继承Object类中的toString方法才对吧!求解释.......



作者: 楚轩    时间: 2014-5-22 16:11
ArrayList 为一个集合类,其toString方法是返回此collection的字符串表示形式,该形式为[对象1,对象2.........];
所以al.toString();会返回[Person1,Person2...];
若Person对象没有复写toString()方法,则返回默认继承Object方法的String。
若Person对象有复写toString()方法,所以最后会返回复写后方法的String。
作者: Shimano    时间: 2014-5-22 23:32
楚轩 发表于 2014-5-22 16:11
ArrayList 为一个集合类,其toString方法是返回此collection的字符串表示形式,该形式为[对象1,对象2..... ...

但是Collection集合中也没有重写toString()方法啊?

我在Person类中重写的toString方法,p.toString();是理所应当的。但是al.toString();调用成功,并且按照打印结果看,al怎么可以调用Person类中的toString方法。
我在想当把Person类放进al这个ArrayList集合类对象中去,Person是不是和al产生了一个什么关系?

不知道呢。。。
作者: 楚轩    时间: 2014-5-22 23:45
本帖最后由 楚轩 于 2014-5-23 00:12 编辑

我是这么理解的,
    Object中    toString() 即  getClass().getName() + '@' + Integer.toHexString(hashCode())
    ArrayList 集合中 toString() 即 返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。    al中的元素没有复写方法,则表现出名字+默认分配的哈希值,如果有复写方法,就表现复写方法中的值。
    这跟数组有区别,数组的toString(),输出的全为1个地址,可能是因为存储位置不一样吧。


作者: ID1003    时间: 2014-5-22 23:54
就我的理解来看,Person类也是继承自Object类,那么Person就是Object的子类咯,在Person中复写了头String方法,并且你在主函数中调用的也是Person类,那么为什么你还要期盼着它还回去调用Object的方法呢。a1是由Person所创建的对象组成的集合,那么他怎么可能还调用Object的toString呢,就好比String类中虽然是自动复写了Object的toString方法但是也是复写,那么你在用String对象组成集合的时候还会去想为什么不去调用Object的toString么?
作者: 飘渺≮★耘    时间: 2014-5-23 11:27
al里面保存的是 person类,在打印是,打印到person时,会调用person的toString方法
作者: zhrnghgwsws    时间: 2014-5-23 12:59
学习一下
作者: youcyou    时间: 2014-5-23 15:28
学习一下
作者: gentleman    时间: 2014-5-24 07:47
本帖最后由 gentleman 于 2014-5-24 07:48 编辑


我是这样理解的
al.toString()是调用了两次,因为你要打印的是集合里的对象,所以先打印集合也就是一对中括号【】这时用的是Object中的toString,然后再打印集合里面的对象,而里面的对象是调用你复写的toString方法。



作者: Shimano    时间: 2014-5-24 09:41
gentleman 发表于 2014-5-24 07:47
我是这样理解的
al.toString()是调用了两次,因为你要打印的是集合里的对象,所以先打印集合也就是一对中 ...

感觉这样理解还是比较合适的...
作者: yinxjfly    时间: 2014-5-25 00:45
传说中的专家模式!谁直接拥有数据,就让谁来处理,
name和age属性是直属于Person类的,虽然集合中存储的是person类的实例对象,但是这些属性Person类处理起来更得心应手,所以当然是调用Person类复写Object类的toString()方法了!
个人理解!




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