java - 传递引用 var 和 GC

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

最佳答案

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

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

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

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

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

然后您返回 cb 并分配给 c3,它实际上执行 c3 = null

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

关于java - 传递引用 var 和 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17306212/

相关文章:

java - 等待特定对象的垃圾收集

带有 TypeScript : passing parameters by reference 的 Angular 4

java - 对象何时符合垃圾收集条件?

Java "dead"对象未被垃圾收集

java - 查找单链表的倒数第 k 个元素

c# - 为什么对象自动通过引用传递?

java - 汉诺塔 : Recursive Algorithm Uses Mysterious Hardcoded Constant 6

java - 等待 2 次点击事件,直到继续不起作用

java - Spring- 如何使用 Spring 依赖注入(inject)来编写独立的 Java 应用程序

java - 如何使用 RESTeasy 从多部分/表单数据请求中获取 UTF-8 格式的文本/xml?