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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mls123456 中级黑马   /  2015-7-6 18:17  /  410 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么结果是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);
                }
        }
}


8 个回复

倒序浏览
for 循环了3次之后,在list数组里保存了什么?
每个都是指向同一个堆Date类型的数据的一个引用
你for循环完了 data.val =103了
当然输出3次102了


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

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


(如果理解错误,望 大牛指出)
回复 使用道具 举报
同意楼上的说法
回复 使用道具 举报
Data data = new Data();改为
Data data;

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

就行了。
回复 使用道具 举报
结果是102么 ?不会啊 你给我解释一下啊
回复 使用道具 举报
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了。如有哪里不对还望帮忙更正
回复 使用道具 举报
呆呆怪兽 发表于 2015-7-6 21:36
感觉你的回答一半对。data是引用类型,但是data实例里val是一个常量。for循环满足条件的有3次,分别是i=1 ...

可能是我的表达不准确吧,我的意思跟你一样。还望见谅
回复 使用道具 举报
张恩祺 发表于 2015-7-6 21:24
结果是102么 ?不会啊 你给我解释一下啊

现在知道了,往list集合里装的是data 类的val,data.val是随i改变的,就相当于重复地给data.val赋值,最后就剩102,
回复 使用道具 举报
这个代码似乎有几处错误啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马