我知道内部类的一个实例必须绑定到包装类的一个实例,这导致我质疑包装器类实例会发生什么,当没有对它的引用但是仍然有引用时绑定的实例。
因此,一旦引用设置为null,otr是否有资格引用垃圾收集?
class Outer
{
class Inner
{
}
}
class Test{
public static void main(String []args){
Outer otr = new Outer() ; // (1)
Outer.Inner oi = otr.new Inner() ; // (2)
otr = null ; // (3)
// more complicated code
}
}
答案 0 :(得分:4)
正如您所说,(非静态)内部类具有对用于创建它的外部类实例的(隐式)引用。因此,在不再(强烈)引用内部类的实例之前,不能对外部类的实例进行垃圾回收。
答案 1 :(得分:3)
如果查看字节代码,那么您将看到Inner
保留对Outer
的隐藏引用,该引用由Java编译器自动生成。
只要可以引用oi
,也可以引用otr
。
现在您可能认为优化步骤可以消除对Outer
的隐藏引用,因为Inner
从不使用它。但有人可以扩展Inner
并尝试从那里访问Outer
,因此编译器无法做出这样的假设。
答案 2 :(得分:2)
不,(1)中创建的对象无法收集垃圾。
在(2)中创建的内部类实例保存对object(1)的引用,以便访问它的字段和方法。
删除第(3)行中对象(1)的直接引用不会使对象(1)有资格进行垃圾回收,因为对象仍在内部类实例(2)内部使用。