Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不调用新对象();两次使第一次调用创建的对象有资格进行垃圾收集?_Java_Garbage Collection - Fatal编程技术网

Java 不调用新对象();两次使第一次调用创建的对象有资格进行垃圾收集?

Java 不调用新对象();两次使第一次调用创建的对象有资格进行垃圾收集?,java,garbage-collection,Java,Garbage Collection,鉴于: 调用doSomething()方法时,第5行中创建的对象在哪一行之后可用于垃圾收集 正确答案是第8行 为什么呢?我认为应该是第7行,因为new将启动一个新的对象,然后分配给o,这导致在第5行中创建的对象失去其引用(然后符合GC)。我错了吗 正确答案是第8行。为什么呢 您将o本地到doSomething()与类级别的o混淆。即使第7行将doSomething()版本的o设置为其他引用,您仍然拥有通过doSomethingElse()方法设置的类级别o。您必须将该引用设为null,以使其符合

鉴于:

调用
doSomething()
方法时,第5行中创建的
对象在哪一行之后可用于垃圾收集

正确答案是第8行

为什么呢?我认为应该是第7行,因为new将启动一个新的
对象
,然后分配给
o
,这导致在第5行中创建的
对象
失去其引用(然后符合GC)。我错了吗

正确答案是第8行。为什么呢


您将
o
本地到
doSomething()
与类级别的
o
混淆。即使第7行将doSomething()版本的
o
设置为其他引用,您仍然拥有通过
doSomethingElse()
方法设置的类级别
o
。您必须将该引用设为null,以使其符合GC条件,而这只能通过第8行的方法调用实现。

Yes!非常感谢你!我现在明白了。我没有注意到隐藏实例变量的局部对象o,这个问题是为了混淆这个方式而设计的,我认为=.=酷,我很高兴这有帮助!
    1. public class GC {
    2.    private Object o;
    3.    private void doSomethingElse(Object obj) { o = obj; }
    4.    public void doSomething() {
    5.       Object o = new Object();
    6.       doSomethingElse(o);
    7.       o = new Object();
    8.       doSomethingElse(null);
    9.       o = null;
    10.   }
    11. }