A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 李东梁 中级黑马   /  2014-3-28 16:13  /  1425 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东梁 于 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.如果取消中间一行的注释为什么会报错?

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

5 个回复

倒序浏览
报错是因为你第31行:Data tmp = (Data )list.get(j);因为你//list.add("123654");给集合加如一个字符串对象,你哪个强转成 (Data )会报类型转换异常的错,
回复 使用道具 举报
至于你的运行过程,就是给ArrayList集合添加元素,虽然在不断的改变成员变量的值,但你这里只new了一个data对象,所以你添加的始终都是同一个对象的引用。打印的结果都是102
回复 使用道具 举报
一年_Hei 发表于 2014-3-28 16:27
至于你的运行过程,就是给ArrayList集合添加元素,虽然在不断的改变成员变量的值,但你这里只new了一个data ...

知道了,谢谢你了
回复 使用道具 举报
首先,不注释中间那行。爆出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

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
两点内容提醒,希望能帮到你!
  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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马