黑马程序员技术交流社区

标题: 急求 程序执行过程...... [打印本页]

作者: 李东梁    时间: 2014-3-28 16:13
标题: 急求 程序执行过程......
本帖最后由 李东梁 于 2014-3-28 19:02 编辑
  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.           ArrayList list = new ArrayList();
  14.          
  15.          
  16.           //list.add("123654");
  17.   
  18.          
  19.           for (int i=100; i<103; i++) {
  20.             data.setVal(i);
  21.             list.add(data);
  22.           }

  23.         int j = 0;
  24.         while (j < list.size()) {
  25.           Data tmp = (Data )list.get(j);
  26.           System.out.println("list(" + j + ") = " + tmp.getVal());
  27.           j++;
  28.         }
  29.   }
  30. }
复制代码


1.请问这个程序执行的过程什么样的?

2.如果取消中间一行的注释为什么会报错?
作者: 一年_Hei    时间: 2014-3-28 16:23
报错是因为你第31行:Data tmp = (Data )list.get(j);因为你//list.add("123654");给集合加如一个字符串对象,你哪个强转成 (Data )会报类型转换异常的错,
作者: 一年_Hei    时间: 2014-3-28 16:27
至于你的运行过程,就是给ArrayList集合添加元素,虽然在不断的改变成员变量的值,但你这里只new了一个data对象,所以你添加的始终都是同一个对象的引用。打印的结果都是102
作者: 李东梁    时间: 2014-3-28 16:44
一年_Hei 发表于 2014-3-28 16:27
至于你的运行过程,就是给ArrayList集合添加元素,虽然在不断的改变成员变量的值,但你这里只new了一个data ...

知道了,谢谢你了
作者: 阳春烟景    时间: 2014-3-28 17:25
首先,不注释中间那行。爆出18行:java.lang.ClassCastException。。。这是个类型转换异常错误。。。18行中把list强转成Data...,强制类型转换在某种情况下会丢失精度...这是程序报错的原因。。
注释掉中间行,运行结果:
list(0) = 102
list(1) = 102
list(2) = 102
原因是:tmp.getVal(),这个在tmp在调用list中的get()方法中。得到是list中上面刚加入的3个元素中最后一个。也就是102.。每次都是调用。所以得到结果是一样的。。

QQ截图20140328170506.png (168.5 KB, 下载次数: 35)

QQ截图20140328170506.png

QQ截图20140328171014.png (141.73 KB, 下载次数: 27)

QQ截图20140328171014.png

作者: ╰青青子佩ˊゝ    时间: 2014-3-28 18:54
两点内容提醒,希望能帮到你!
  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[] args){
  12.                 Data data = new Data();
  13.               ArrayList list = new ArrayList();      
  14.               //list.add("123654");
  15.               //1.list里存储的是对象元素的引用地址,只New了一个Data对象,也就是只有一个引用地址.for循环代码执行过后,value等于了102,然后向List中添加了三个元素,引用地址却是三个相同得到,所以指向的对象是同一个,那么value自然也就都是102了
  16.               for (int i=100; i<103; i++) {         
  17.                       data.setVal(i);
  18.                       list.add(data);
  19.               }
  20.             int j = 0;
  21.             while (j < list.size()) {
  22.             //2.这里用到强制类型转换,字符串"123456"不属于Data类型,当然会报错
  23.               Data tmp = (Data )list.get(j);
  24.               System.out.println("list(" + j + ") = " + tmp.getVal());
  25.               j++;
  26.             }
  27.         }
  28. }
复制代码





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