垃圾收集 - 为什么c3在此示例中不符合收集条件(SCJP 6)

Lia*_*yan 3 java garbage-collection scjp pass-by-value

摘自SCJP 6准备书 -

鉴于:

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;
        // do Stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

当达到// doStuff时,有多少对象符合GC条件?

A. 0

B. 1

C. 2

D.编译失败

E.无法知道

F.运行时抛出异常

正确答案是C - "只有一个CardBoard对象(c1)符合条件,但它有一个相关的Short包装器对象,也符合条件."

我的问题是为什么c3不符合收藏资格?

我的想法是 -

c1.go(c2)将本地引用变量cb(它是c2的副本)设置为null,然后返回分配给c3的cb.我知道c2本身的引用变量不能在方法中修改,只能修改它背后的对象.但是在我看来,引用变量cb的副本被设置为null并分配给c3.为什么在此实例中c3未设置为返回的null?

Kay*_*man 7

没有与c3相关的对象.它的值为null,因此无需收集任何内容.

  • 是的,如果首先实例化了c3,那么它将适用于GC (4认同)