考虑下面的代码。对象objectOfA_In_B
的最终值是什么?
Class A
{
// Some parameters and method with complicated logic goes here
}
Class B
{
A objectOfA_In_B = new A();
B()
{
// Operation done on objectOfA
}
public A getObjectA()
{
return objectOfA_In_B;
}
}
Class C
{
public static void main(String[] args)
{
try
{
A objectOfA_In_C = null;
B objectOfB = new B();
objectOfA_In_C = B.getObjectA()
// Rest of logic goes here
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
objectOfA_In_C = null;
}
}
}
通过objectOfA_In_B
& #39;主要方法只是因为它们指向同一个对象?是否已准备好从垃圾收集器收集null
和objectOfA_In_C
?
答案 0 :(得分:1)
这里有两个变量,只有一个对象。任何一个变量都可以指向对象。对变量的赋值对其他变量没有影响。当没有变量指向它时,对象(不是变量)已准备好进行垃圾收集。变量不能被垃圾收集,只有对象可以。
(因为这看起来像是家庭作业,所以我留下了一些结论,因为你想学习。:))
答案 1 :(得分:1)
由于您只将null
分配给本地参考,因此它不会null
。这不会改变任何可能指向该对象的引用。因此,objectOf_A_In_B
不会受到影响,因此GC尚未准备好收集
答案 2 :(得分:1)
通过将objectOfA_In_C设置为null,objectOfA_In_B也将为null 最后阻止C的主要方法只是因为它们是指向 对同一个对象?
不,Java是值得传递的。甚至对象的引用都是按值传递的。因此,通过将objectOfA_In_C
设置为null
,objectOfA_In_B
将不会变为空。
是否已准备好收集objectOfA_In_C和objectOfA_In_B 来自垃圾收集器
此处只有一个A
实例和2个引用它的引用(其中一个在null
块中设置为finally
。当没有引用指向它时,该实例将为GC做好准备。注意objectOfA_In_B
仍然指向该实例。