class Cardboard{
Short story = 200;
Cardboard go(Cardboard cb){
cb = null;
return cb;
}
public static void main(String args[]){
Cardboard c1 = new Cardboard();
Cardboard c2 = new Cardboard();
Cardboard c3 = c1.go(c2);
c1 = null;
}
}
执行go()
后,c2
应指向null
,如方法所暗示的那样。c2
的此引用将传递给c3
变量,它再次指向null
,因此c2
的对象必须可用于垃圾收集。
答案 0 :(得分:1)
那是不对的。将对象作为参数传递给方法时,它会传递对该对象的引用,仅此而已。对象的引用cb
变为null,但c2
仍然是对同一对象的引用,因此Java仍然认识到堆上的对象在指向它的代码中有一个引用: c2
。
正如Holger在下面的评论中所指出的,此特定代码段中的所有对象都有资格进行垃圾回收,因为它们未被使用。 Java的GC有多种方法可以确定某个对象是否有资格被收集,而且只有这样一个事实,即存在一个指向该对象的引用并不能保护它不被收集,但是该对象的使用会。 / p>