如果我们将引用变量传递给方法并修改对象的状态,则修改是永久性的(如果我错了,请纠正我)。考虑一下代码:
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) { //....(1)
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2); //pass c2 into a method ....(2)
c1 = null;
// do Stuff
} }
当在上面的代码中,我们说cb = null并返回cb,c2(以及c3)现在应该有空引用吗? (PS:原始问题在“// do stuff”之后要求有资格获得gc的对象。答案是2,但我在理解它时遇到问题。)
答案 0 :(得分:3)
不,因为cb=null
仅将“cb”的引用目标从原始实例替换为null
,因此c2
不会受到影响。
当您将c2
传递给函数时,情况将是这样的:
cb c2
| |
------------------
| object |
------------------
一旦cb
设置为null
,就会变为
null--cb c2
|
-------------------
| object |
-------------------
然后你返回cb并分配给c3,它基本上是c3 = null
。
但是,另一方面,如果更改该对象的内部状态,那么所有引用引用的对象的状态肯定会被更改。
答案 1 :(得分:0)
Java严格按传递值。
CardBoard go(CardBoard cb) { // here cb has a *copy* of address c2 points to
cb = null; // when you modify cb, c2 still points to the original location
return cb; // returning null now
}
CardBoard c3 = c1.go(c2); // c3 becomes null because of explicit assignment
c1 = null; // same as c3
你的大部分困惑来自于观察这个
如果我们将引用变量传递给方法并修改对象的状态,则修改是永久性的。
显示为按引用传递但在Java中用作传递值(引用的)。
修改仍然存在,因为(地址的)副本仍然指向原始对象。因此,所有触发的方法(使用 copy 引用)仍会触发原始对象。
但是,如果您要销毁此复制的引用(通过将其设置为 null ),它将不会影响原始对象或指向它的任何其他引用。