Java 传递引用var和GC

Java 传递引用var和GC,java,garbage-collection,pass-by-value,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

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

 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引用吗?(注:最初的问题要求在“//do stuff”之后有资格使用gc的对象。答案是2,但我在理解它时遇到了问题。)

Java严格按值传递

你的大部分困惑来自于观察这一点

如果我们将引用变量传递给方法并修改对象的状态,则修改是永久的

它显示为passbyreference,但在Java中用作(引用的)passbyvalue

由于(地址的)副本仍然指向原始对象,因此修改会持续。因此,所有激发的方法(使用复制引用)仍然激发原始对象


但是,如果要销毁此复制的引用(通过将其设置为null),则不会影响原始对象或指向它的任何其他引用。

否,因为
cb=null
仅将“cb”的引用目标从原始实例替换为
null
,因此
c2
不会受到影响

当您将
c2
传递到函数中时,情况如下:

  cb       c2 
  |         | 
------------------
|      object    |
------------------
一旦
cb
设置为
null
,它将变为

null--cb       c2 
               | 
  -------------------
  |      object     |
  -------------------
返回cb并赋值给c3,它实际上是
c3=null


但是,另一方面,如果更改该对象的内部状态,则所有引用引用的对象的状态肯定会更改。

No,因为引用是按值传递的。关于堆栈溢出(以及网络上的其他页面)有很多问题,详细讨论了这些问题。cb是指向同一对象的指针,而不是指针copy@Tala请刷新答案。我已经改写了。好吧,撤销投票
null--cb       c2 
               | 
  -------------------
  |      object     |
  -------------------