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 |
-------------------