黑马程序员技术交流社区

标题: List集合添加自定义对象的小问题,打印结果很出乎意料 [打印本页]

作者: 吴立杰    时间: 2012-7-21 21:56
标题: List集合添加自定义对象的小问题,打印结果很出乎意料
  1. class Data {
  2. int val;
  3. int getVal() {
  4. return val;
  5. }
  6. void setVal(int val) {
  7. this.val = val;
  8. }
  9. }

  10. public class ListTest {

  11. public static void main(String argv[]) {
  12. Data data = new Data();
  13. //创建了一个对象!
  14. ArrayList list = new ArrayList();

  15. for (int i=100; i<103; i++) {
  16. data.setVal(i);
  17. list.add(data);
  18. }

  19. int j = 0;
  20. while (j < list.size()) {
  21. Data tmp = (Data )list.get(j);
  22. System.out.println("list(" + j + ") = " + tmp.getVal());
  23. j++;
  24. }
  25. }
  26. }
复制代码

作者: 黎健东    时间: 2012-7-22 04:22
  1. package Heima001_DumpAndDown100;

  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.Iterator;

  5. class Data {
  6.         int val;

  7.         int getVal() {
  8.                 return val;
  9.         }

  10.         void setVal(int val) {
  11.                 this.val = val;
  12.         }
  13. }

  14. public class Test001_DumpAndDown100 {
  15.         public static void main(String[] args) throws IOException {
  16.                 Data data;
  17.                 // 创建了一个对象!
  18.                 ArrayList<Data> list = new ArrayList<Data>();

  19.                 for (int i = 100; i < 103; i++) {
  20.                         data = new Data();       
  21.                         data.setVal(i);
  22.                         list.add(data);
  23.                 }

  24.                 int j = 0;
  25.                 Iterator<Data> it = list.iterator();
  26.                 while(it.hasNext()){
  27.                         Data d = it.next();
  28.                         System.out.println("list(" + j + ") = " + d.getVal());
  29.                 }
  30.         }

  31. }
复制代码
你只是在for外边创建了一个对象,for循环的时候,每次都在使用data这一个对象,l使用同样的对象i值当然也是同样的了,ist里边就添加了3个同样的data


作者: 曾玉锋    时间: 2012-7-22 10:48
楼主的问题实质在:没弄明白引用类型对象的创建在内存中的具体表现是怎样的。
我用自己的理解来解释一下,希望你能明白。
Data data = new Data();
这个表达式可以分为两部分,Data data 只是声明一个Data 类型 的名称 data,不分配内存空间,也就不存在实际意义,只是一个名字;
而new Data() 则是真实的在内存中分配一个空间并创建一个Data 类型的对象。
只有在将new Data() 赋值给Data data以后,data才有了实际意义。

举个通俗一点的例子,
有一个人名字叫"张三",但是我们并不认识,所以对于张三是谁,张三的信息我们不去关心,因为没有啥意义。
当有一天,有一个人来到大家面前自我介绍说:"我是张三"。OK,大家都知道了"张三"可以代表这个人了,那么我们就可以去对他的特征和行为进行评价。
如果有一天,这个人缺胳膊少腿了,那么他还是"张三",因为"张三"这个名字是代表这个人,指向这个人的。
所以,下面这段代码代表的是同一个意思
for (int i = 100; i < 103; i++) {

                        data = new Data();        

                        data.setVal(i);//虽然改变了对象的值,但是并没有改变对象本身是自己这个事实,所以不管他改变多少次,但是张三还是代表这个人。
                         //除非某一天,有人跟你说,张三不是这个人了,是另外一个人,那么才是真正的改变。                 
                        list.add(data);

                }


当然,如果有一天,张三说:"我还有一个英文名字叫Json",那么,Json也是指向"这个人"。

建议查一下声明对象时内存空间的分配情况(指针指向谁就代表谁),只有明白了这个,以后才不会有疑惑。(个人理解,如果有误,请指正,谢谢!)




作者: 黑马李果    时间: 2012-7-26 20:39
一看到System.out.println, 我就知道你们在.net交流区讨论Java.




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