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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭振 中级黑马   /  2012-5-20 09:05  /  2045 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Data {
        int        val;
        int        getVal() {
                return val;
        }
        void        setVal(int val) {
                this.val = val;
        }
}

public class ListTest {

  public static void main(String argv[]) {
          Data data = new Data();
          ArrayList list = new ArrayList();

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

        int j = 0;
        while (j < list.size()) {
          Data tmp = (Data )list.get(j);
          System.out.println("list(" + j + ") = " + tmp.getVal());
          j++;
        }
  }
}

8 个回复

倒序浏览
  public static void main(String argv[]) {     //1.主函数进栈
          Data data = new Data();              //2.在栈中创建了变量,并且在堆中创建了一个new Data()的对象,并将该对象的地址值赋值给变量data
          ArrayList list = new ArrayList();    //申明一个集合

          for (int i=100; i<103; i++) {      
            data.setVal(i);                   //调用setval方法,对对象的属性进行赋值运算
            list.add(data);                   //明确一点,arraylist的底层结构是数组,而且可以插入重复数据
                                              //所以每循环一次,都会将这个对象存入到集合中
          }

        int j = 0;                            //定义一个变量,计数器
        while (j < list.size()) {             //判断条件,当j小于list的长度
          Data tmp = (Data )list.get(j);      //将其强制转换成Data对象
          System.out.println("list(" + j + ") = " + tmp.getVal());  //打印输出结果
          j++;                                //每循环一次,j+1.
        }
回复 使用道具 举报
本帖最后由 踩单车的幸福 于 2012-5-20 09:25 编辑

因为list集合中存入的都是同一个对象,所以在输出的结果中看到的是102,这个不要有什么疑惑。

举例简单来说吧,你有一个房子(相当于Data)
setval是用来改变房子中的格局( data.setVal(i)),而list放的是这个房子的地址(list.add(data);)
最后的输出结果相当于,你把屋子收拾完了以后,让别人来参观,他们看到的是你最终收拾完成的结果,跟你中间怎么收拾的一点关系都没有。
回复 使用道具 举报
怎么打印的都是102?
把  Data data = new Data(); 放到for循环体的第一行会更好。

过程:1创建3个Data 对象,并加入集合ArrayList
         2遍历ArrayList,打印其中元素(Data实例)的val属性值。

回复 使用道具 举报
本帖最后由 任睦强 于 2012-5-20 09:28 编辑

class Data {
        int val;
        int getVal() {
           return val;
        }
        void setVal(int val) {
           this.val = val;
        }
}

public class ListTest {

  public static void main(String argv[]) {
          Data data = new Data();//先在栈空间创建一个对象
          ArrayList list = new ArrayList();//在创建一个集合
         
          for (int i=100; i<103; i++) {
            data.setVal(i);//通过set方法把对象里的属性赋值
            list.add(data); //通过循环把3个对象放到集合中
          }

        int j = 0;//计数器
        while (j < list.size()) {
          Data tmp = (Data )list.get(j);//因为开始没有指定类型,对象存进集合中就变成object型,所以你往外取的时候必须指定类型,也就是拆箱
          System.out.println("list(" + j + ") = " + tmp.getVal());//在通过get方法取值
          j++;
        }
  }
}
回复 使用道具 举报
踩单车的幸福 发表于 2012-5-20 09:20
因为list集合中存入的都是同一个对象,所以在输出的结果中看到的是103,这个不要有什么疑惑。

举例简单来 ...

明白了,谢了好兄弟!
回复 使用道具 举报
李哲 发表于 2012-5-20 09:23
怎么打印的都是102?
把  Data data = new Data(); 放到for循环体的第一行会更好。

首先确定一下它只创建了一个对象。只new了一次,而在集合中讲这个的地址值存在3次而已。
回复 使用道具 举报
郭振 发表于 2012-5-20 09:27
明白了,谢了好兄弟!

呵呵 一起学习 刚才看错了 结果是102 抱歉哈
回复 使用道具 举报
郭振 中级黑马 2012-5-20 09:31:36
9#
呵呵,你最后几句话一下就把我不明白的地方讲清楚了,太感谢了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马