gpt4 book ai didi

java - 在java中,更新一个对象时会发生什么?

转载 作者:行者123 更新时间:2023-12-01 12:32:59 24 4
gpt4 key购买 nike

鉴于:

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

当调用doSomething方法时,在哪一行之后第5行创建的Object可用于垃圾收集?

A. 5号线
B. 6号线
C.7号线
D.8号线
E.9号线
F.第 10 行

答案是 D,解释是在第 7 行中 new Object() 不会 new 一个新对象,它只是在第 5 行中创建的对象。

我对此很困惑,有人可以帮助我吗?

最佳答案

让我们把这个写得更清楚一点,并澄清一下名称:

public class GC { 

private Object o;
private void setObj(Object obj) { o = obj; }
public void doSomething() {
Object o = new Object(); //4
setObj(o);
o = new Object(); //6
setObj(null); //7
o=null;
}
}

现在,考虑一下第 4 行创建的对象 o 必须存活多长时间:在第 5 行,您将在封闭类中保存对它的引用。因此,现在只要封闭类存在并且持有对它的引用,引用就不能被 GC。

一旦您在第 7 行调用 setObj(null),封闭类就不再保留对第 4 行中创建的对象的引用。o 的唯一现有副本将是作用域中的副本,但变量“o”不再是long 引用该初始对象,因为您已覆盖第 6 行中的引用。

顺便说一句<您的示例有点难以阅读 - 某些格式会让这变得更容易一些。

关于java - 在java中,更新一个对象时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25799519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com