首页 新闻 赞助 找找看

JAVA 关于对象引用的问题

0
悬赏园豆:10 [已解决问题] 解决于 2016-07-26 18:30
        Sup s1=new Sup();
        s1.setId(1);
        List<Sup> s=new ArrayList<>();
        s.add(s1);
        System.out.println(s);
        s1=new Sup();
        s1.setId(111);
        System.out.println(s);

这段代码为什么两次输出的结果会是一样的?ID都是1,为什么第二次输出的不是111?List中存储的不是引用吗?

迷路的猫的主页 迷路的猫 | 初学一级 | 园豆:185
提问于:2016-07-26 13:40
< >
分享
最佳答案
1

Java中虽然传的是引用,但是用的时候是直接操作的原对象。你虽然是给的LIST引用,但是LIST会通过引用把原对象拿到,之后你给的那个引用跟他没有关系了。

举个栗子:

你拿了一个laser(汉字不让发啊)(引用)在墙上刻了一个字(对象),然后用LASER指给LIST让它记下来,

然后!你用LASER在墙上别处刻了另一个字,现在已经有两个字了,新的还没有告诉LIST,所以LIST不知道啊~

除非你把LASER指回去,改原来那个字~

收获园豆:10
之奇一昂 | 小虾三级 |园豆:1421 | 2016-07-26 13:52

明白了,List中存储的是s1的副本,后面对s1的修改不会影响到list中的副本 

迷路的猫 | 园豆:185 (初学一级) | 2016-07-26 14:19

@迷路的猫: 副本 这个词可能不太恰当,对象只有一个~也不清楚你对JAVA里面对象了解多少,大体讲一下:JAVA里面没有一个东西是可以拿到一个对象的实体的,都是拿到的引用。就像银行里面的钱与账号密码一样,任何机构看到的都是数字,并不是钱本身。

你拿张纸,开了一个户存上钱,然后你把纸上的账号告诉了LIST,这时候,你和LIST手里面的都不是钱本身,而是钱的代表,也就是引用。

然后把纸擦了又写上了一个新开的户的账号,你往里面存钱LIST是不知道的。

当然,也可以再把纸上擦了写回原来的账号,你如果操作里面的钱的话,LIST一查也会发现的。

这里面,钱就一份,没有副本。

再多说一句,如果没有任何东西拿着银行里的一个户的账号的话,那这个账户就是垃圾了,上帝会发现并清理的,这就是GC

乱乱的,凑和着看看吧

之奇一昂 | 园豆:1421 (小虾三级) | 2016-07-26 14:47

@之奇一昂: 不错不错,多谢帮助

迷路的猫 | 园豆:185 (初学一级) | 2016-07-26 18:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册