传递引用var和GC

时间:2013-06-25 19:48:28

标签: java garbage-collection pass-by-value

如果我们将引用变量传递给方法并修改对象的状态,则修改是永久性的(如果我错了,请纠正我)。考虑一下代码:

 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,但我在理解它时遇到问题。)

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 ),它将不会影响原始对象或指向它的任何其他引用。