作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
鉴于:
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/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!