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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhenshuai888 中级黑马   /  2017-1-5 00:39  /  1538 人查看  /  14 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

1、分析运行结果,说明原理。(没有分析结果不得分)
import java.util.ArrayList;

class Data {

   int val;

}

public class Test {

    public static void main(String args[]) {
        Data data = new Data();
        ArrayList<Data> list = new ArrayList<Data>();
   
        for (int i = 100; i < 103; i++) {
            data.val = i;
            list.add(data);
        }
   
        for (Data d : list) {
            System.out.println(d.val);
        }
    }
}


求助  这个怎么分析啊

14 个回复

倒序浏览
回复 使用道具 举报
下面是我的想法 不保证正确:
首先 Data这个类里有个成员变量 int 类型的 val
在 Test 这个类的主方法中 创建了 Data 类的对象 data
和泛型是 Data 的 ArrayList 集合 list
然后利用普通 for 循环 往 list 集合中添加元素 普通, for 循环中定义了一个 int 类型的变量 i ,i的初始化值是 100,每次循环自增 1,当 i = 103时跳出循环
在普通 for 循环中 访问 Data 类中默认的空参构造创建并赋于值 i
赋值后 将它的地址值存入 list 集合中
下面是增强 for 循环
左边是 Data 类型的 b ,右边是要遍历的 list 集合,每次循环把 list 集合中的一个元素 根据地址值找到对应的值 并打印到控制台,直到把 list 集合内的元素全部读完为止
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
看不懂data.val是什么,至少得把data类贴出来吧,难不成是date类?那就更不懂了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
刚有一个地方看错了
普通 for 循环中 list 添加的是 Data 对象 所以存的是同一个地址值 指向同一片内存空间
一共循环了两次 存入了两个地址值
前一个值会在第二次循环中,给 data.val 赋值的时候覆盖掉
所以最后打印到控制台的应该是:
102
102
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
最后打印到控制台的是 三个 102 而且每个 102 占一行
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
掉坑了。。这些细节。受教了。。。感谢分享
回复 使用道具 举报
亲 来个专业点的答复啊
回复 使用道具 举报
回复 使用道具 举报
1.实例化Data对象,并给他的val赋值,,但是集合加的都是对象的地址值3次一样的。然后用增强for循环遍历集合,向控制台输出val的内容,3次都是102
输出是这样的:
102
102
102
以上。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
精彩  答的很精辟
回复 使用道具 举报
学习,学习
回复 使用道具 举报
KyneZhk 发表于 2017-1-7 10:51
有个问题这个类名取为Date不报错?

不会报错,首先没导包,然后就是有自己定义的类的话,就会首先用自己的类
回复 使用道具 举报
newu 黑马帝 2017-1-7 15:08:44
14#
亲 来个专业点的答复啊
回复 使用道具 举报
运行结果为
* 102
* 102
* 102
*
* 原因: 在内存中只存在一个data对象,用for循环向集合list中添加3的个元素都是同一个data对象
* for循环中,每次像data对象赋值,后者会替换前者,当最后一赋值后,那个变量val的值就为102
* 当遍历集合时:相当于执行了三次System.out.println(data.val),所以结果为3个换行的102
*
* 具体分析如下:
*/


// 创建Data类,定义int类型 成员变量 val
class Data {
        int val;
}

public class Test01 {

        public static void main(String args[]) {

                //例化一个Data对象,这个对象保存在堆内存中,其中成员变量val也保存在堆内存中
                Data data = new Data();
                // 创建ArrayList集合 并且声明泛型类型为<Data>
                ArrayList<Data> list = new ArrayList<Data>();

                // for循环 i依次为100 101 102
                for (int i = 100; i < 103; i++) {

                        // 给data对象的成员变量val赋值
                        data.val = i;
                       
                         //在List添加data对象之前只是修改了data对象的成员变量val的值,但是并没有重新实例化对象
                        // 在内存中只存在一个data对象,用for循环向集合list中添加3的个元素都是同一个data对象
                        // for循环中,每次向data对象赋值,后者会替换前者,当最后一次赋值后,变量val的值为102
                        list.add(data);

                }

                // 遍历集合
                for (Data d : list) {
                       
                        //因为List添加的是同一个引用,所以在打印结果的时候,打印的也是同一个引用的最后一次被修改的值.
                        //即执行了三次System.out.println(data.val),结果为3个换行的102
                        System.out.println(d.val);
                }

        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马