黑马程序员技术交流社区

标题: 关于数组的题目 [打印本页]

作者: mls123456    时间: 2015-7-6 18:17
标题: 关于数组的题目
为什么结果是102,102,102,呢,请帮忙解答一下
class Data {
        int val;
}
public class lass {
        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);
                }
        }
}



作者: zhuoxiuwu    时间: 2015-7-6 18:29
for 循环了3次之后,在list数组里保存了什么?
每个都是指向同一个堆Date类型的数据的一个引用
你for循环完了 data.val =103了
当然输出3次102了


list里3个数据都是 对同一个Date类型数据的地址的一个拷贝

java里只有按值 传递 不过 list.add(data); 传递的不是data的具体的值,而是堆中data数值地址的一个拷贝。


(如果理解错误,望 大牛指出)
作者: ZhangHeng    时间: 2015-7-6 20:00
同意楼上的说法
作者: firwood    时间: 2015-7-6 21:01
Data data = new Data();改为
Data data;

在 data.val = i;前面加一条
data = new Data();

就行了。
作者: 张恩祺    时间: 2015-7-6 21:24
结果是102么 ?不会啊 你给我解释一下啊
作者: 呆呆怪兽    时间: 2015-7-6 21:36
zhuoxiuwu 发表于 2015-7-6 18:29
for 循环了3次之后,在list数组里保存了什么?
每个都是指向同一个堆Date类型的数据的一个引用
你for循环完 ...

感觉你的回答一半对。data是引用类型,但是data实例里val是一个常量。for循环满足条件的有3次,分别是i=100,i=101,i=102。这三次都会给int类型的val赋值。因为是常量,所以每次都会覆盖val的值。所以最后循环打印肯定是3次102了。如有哪里不对还望帮忙更正
作者: zhuoxiuwu    时间: 2015-7-6 21:46
呆呆怪兽 发表于 2015-7-6 21:36
感觉你的回答一半对。data是引用类型,但是data实例里val是一个常量。for循环满足条件的有3次,分别是i=1 ...

可能是我的表达不准确吧,我的意思跟你一样。还望见谅
作者: 2297618472    时间: 2015-7-6 21:58
张恩祺 发表于 2015-7-6 21:24
结果是102么 ?不会啊 你给我解释一下啊

现在知道了,往list集合里装的是data 类的val,data.val是随i改变的,就相当于重复地给data.val赋值,最后就剩102,
作者: 半山岩    时间: 2015-7-6 22:10
这个代码似乎有几处错误啊




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