黑马程序员技术交流社区

标题: 黑马社招题 [打印本页]

作者: zhenshuai888    时间: 2017-1-5 00:39
标题: 黑马社招题
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);
        }
    }
}


求助  这个怎么分析啊
作者: 普通的瓶子    时间: 2017-1-5 00:53
飘过,还没学到这

作者: 痴恋雪玥    时间: 2017-1-5 07:39
下面是我的想法 不保证正确:
首先 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 集合内的元素全部读完为止

作者: 愤怒的大飞机    时间: 2017-1-5 07:47
看不懂data.val是什么,至少得把data类贴出来吧,难不成是date类?那就更不懂了

作者: 痴恋雪玥    时间: 2017-1-5 08:14
刚有一个地方看错了
普通 for 循环中 list 添加的是 Data 对象 所以存的是同一个地址值 指向同一片内存空间
一共循环了两次 存入了两个地址值
前一个值会在第二次循环中,给 data.val 赋值的时候覆盖掉
所以最后打印到控制台的应该是:
102
102

作者: 痴恋雪玥    时间: 2017-1-5 08:15
最后打印到控制台的是 三个 102 而且每个 102 占一行

作者: 月微怜    时间: 2017-1-5 23:24
掉坑了。。这些细节。受教了。。。感谢分享
作者: zhenshuai888    时间: 2017-1-6 00:00
亲 来个专业点的答复啊
作者: WUKIMDA    时间: 2017-1-6 00:16
有点简单。。。。

作者: WUKIMDA    时间: 2017-1-6 00:22
1.实例化Data对象,并给他的val赋值,,但是集合加的都是对象的地址值3次一样的。然后用增强for循环遍历集合,向控制台输出val的内容,3次都是102
输出是这样的:
102
102
102
以上。

作者: zhenshuai888    时间: 2017-1-6 20:40
精彩  答的很精辟
作者: 一片叶~    时间: 2017-1-7 11:12
学习,学习
作者: 愤怒的大飞机    时间: 2017-1-7 13:17
KyneZhk 发表于 2017-1-7 10:51
有个问题这个类名取为Date不报错?

不会报错,首先没导包,然后就是有自己定义的类的话,就会首先用自己的类
作者: newu    时间: 2017-1-7 15:08
亲 来个专业点的答复啊
作者: zhenshuai888    时间: 2017-1-8 09:30
运行结果为
* 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);
                }

        }
}





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