黑马程序员技术交流社区

标题: 大家看一些这个程序,我认为是错了不会有输出结果 [打印本页]

作者: lanbuohan    时间: 2013-7-12 19:26
标题: 大家看一些这个程序,我认为是错了不会有输出结果
本帖最后由 杨兴庭 于 2013-7-14 10:57 编辑

  1. <P>分析运行结果,说明原理。</P>
  2. <P> </P>
  3. <P>大家说说它为什么会出错误,因为什么知识点。
  4. import java.util.ArrayList;

  5. class Data {
  6. int val;
  7. }

  8. public class Test {
  9. public static void main(String args[]) {
  10. Data data = new Data();
  11. ArrayList list = new ArrayList();

  12. for (int i = 100; i < 103; i++) {
  13. data.val = i;
  14. list.add(data);
  15. }
  16. </P>
  17. <P>//错误写法。
  18. <FONT color=red>for (Data d : list)</FONT> {
  19. System.out.println(d.val);
  20. }
  21. }
  22. }

  23. </P>
复制代码
  1. package cn.itcast.IO;

  2. import java.util.ArrayList;
  3. import java.util.Collection;


  4. class Data{
  5. int i ;
  6. }

  7. public class Demo1 {


  8. /**
  9. * @param args
  10. */
  11. public static void main(String[] args) {
  12. // TODO Auto-generated method stub
  13. Data data = new Data();
  14. ArrayList<Integer> arl = new ArrayList<Integer>();

  15. for(int j=1;j<=3;j++)
  16. {
  17. data.i = j;
  18. arl.add(data.i);
  19. }
  20. for(Integer a: arl)
  21. {
  22. System.out.println(a);
  23. }


  24. }

  25. }
复制代码

作者: 杨晓燕    时间: 2013-7-12 21:59
{:soso_e101:}表示代码看不懂呀,呵呵
作者: 草貌路飞    时间: 2013-7-12 22:24
第一个的值是不是都一样,都是102,因为你存的都是一个对象...你把对象建外面了,所以循环里add的时候虽然都改变了值,但都是改变一个对象的值,所以最后的值是最后改变过的那个
作者: lanbuohan    时间: 2013-7-13 00:06
杨晓燕 发表于 2013-7-12 21:59
表示代码看不懂呀,呵呵

以讨论为主,没事,都在学习中

作者: lanbuohan    时间: 2013-7-13 00:10
草貌路飞 发表于 2013-7-12 22:24
第一个的值是不是都一样,都是102,因为你存的都是一个对象...你把对象建外面了,所以循环里add的时候虽然 ...

哥们,我大概明白你的意思,你是说我把Data的对象创建在for循环外面,所以最后只会输出最后的结果是吗?
我认为这个像不对,add方法是添加方法,是在List列表中添加元素,是不会出现你出现你说的这种情况,你看看我第二课程序,那个程序你运行一下,你就会发现,你添加的结果都会输出。
作者: 草貌路飞    时间: 2013-7-13 00:30
lanbuohan 发表于 2013-7-13 00:10
哥们,我大概明白你的意思,你是说我把Data的对象创建在for循环外面,所以最后只会输出最后的结果是吗?
...

我知道 你的第二个程序没有问题,因为你存
作者: 草貌路飞    时间: 2013-7-13 00:31
lanbuohan 发表于 2013-7-13 00:10
哥们,我大概明白你的意思,你是说我把Data的对象创建在for循环外面,所以最后只会输出最后的结果是吗?
...

我知道 你的第二个程序没有问题,因为你存的不是一个对象么,你存的是不同的Integer对象,第一个是同一个Data对象呀
作者: lanbuohan    时间: 2013-7-13 02:41
草貌路飞 发表于 2013-7-13 00:31
我知道 你的第二个程序没有问题,因为你存的不是一个对象么,你存的是不同的Integer对象,第一个是同一个 ...

哦,明白,呵呵,那你认为这个程序是错在哪里呢,是错在list.add(data);
这行代码吗?
作者: 草貌路飞    时间: 2013-7-13 09:03
lanbuohan 发表于 2013-7-13 02:41
哦,明白,呵呵,那你认为这个程序是错在哪里呢,是错在list.add(data);
这行代码吗? ...

看你的list里面想保存什么对象了,如果想保存Data对象的话,那在循环里面每次循环都要初始化创建一个新的对象。比如你可以一直用data这个引用,外面的赋为null,里面每次开始data = new Data();
作者: 木、易m    时间: 2013-7-13 15:53
  1. class Data {
  2.         int val;
  3. }
  4. public class test {
  5.         int count = 0;
  6.         @Test
  7.         public void test()
  8.         {
  9.                 //这里使用了泛型
  10.                 ArrayList<Data> list = new ArrayList<Data>();
  11.                 for (int i = 100; i < 103; i++)
  12.                 {
  13.                         //对象若是放在外面,虽然你感觉每次都是添加了,但是实际上都是对同一对象进行操作
  14.                         //也就是java在内存的是只是在栈里面引向该对象而已
  15.                         //相当于arr[0]指向了对象data,arr[1]也指向了data,arr[2]也指向了data,
  16.                         //但是data只有一个属性val,最终他的值多少,就会输出多少
  17.                         Data data = new Data();
  18.                         data.val = i;
  19.                         list.add(data);
  20.                 }
  21.                 //为什么会出错,是因为list取出来的是Object对象,所以d不是Object对象,所以会出错,
  22.                 //但是加了泛型后,list里面的元素都是Data对象,所以可以遍历
  23.                 for (Data d : list)
  24.                 {
  25.                         System.out.println(d.val);
  26.                 }
  27.         }
  28. }
复制代码

作者: 280270738    时间: 2013-7-13 21:50
这代码应该没错
作者: wll_sx1990    时间: 2013-7-14 00:17
这两个应该是都不会出错的,第一个会放进3个元素,因为ARRAYLIST是可以重复的,第二个也不会错,从j5开始就有了自动装箱和拆箱功能。




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