【问题标题】:passing reference var and GC [duplicate]传递参考 var 和 GC [重复]
【发布时间】:2013-06-22 18:34:49
【问题描述】:

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

 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)现在不应该有 null 引用吗? (PS:原来的问题是在“//do stuff”之后询问符合gc条件的对象。答案是2,但我理解有问题。)

【问题讨论】:

  • 否,因为引用是按值传递的。 Stack Overflow(以及网络上的其他页面)上有 很多 的问题,其中详细介绍了这一点。

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


【解决方案1】:

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

【讨论】:

  • cb 是指向同一个对象的指针,而不是副本
  • @Tala 请刷新答案。我已经改写了。
  • 好的,取消投票
【解决方案2】:

不会,因为cb=null只是将'cb'的引用目标从原始实例替换为null,因此c2不会受到影响。

当你只是将c2 传递给函数时,情况会是这样的:

  cb       c2 
  |         | 
------------------
|      object    |
------------------

一旦将cb 设置为null,它就会变成

null--cb       c2 
               | 
  -------------------
  |      object     |
  -------------------

然后你返回 cb 并分配给 c3,它本质上是 c3 = null

然而,另一方面,如果你改变了那个对象的内部状态,那么被所有引用引用的对象的状态肯定会改变..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2015-07-09
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多