内部class对象如何驻留在内存中?
How inner class object resides in memory?
Outer outer = new Outer();
在堆上创建了 Outer
class 的 Object
并且引用变量指向它。
如果我写的时候没看错的话
Outer.Inner inner=outer.new Inner();
Inner
class 的对象在堆上创建,inner
指向它。在堆中,我们有两个单独的对象,它们包含自己的实例变量。
但是如果我写
Outer.Inner inner=new Outer().new Inner();
仍然有两个 Object
会在堆上为 Outer
创建,另一个为 Inner
。但是参考 inner
只有 Inner
Object's
成员可以访问。谁指的是堆上的外部Object
?如果它没有被任何引用引用,那么它应该符合垃圾收集的条件,这将影响 inner
的使用。
自然地,inner 会保留它想要强引用的事物的强引用——就像它的另一半实例变量驻留在 Outer 中一样。
内部 class 的每个实例都持有对其外部 class 实例的引用。这是您在内部 class 方法之一中编写 Outer.this
时获得的参考。匿名 Outer
实例将不符合垃圾回收条件,除非与其关联的所有 Inner
实例也符合垃圾回收条件。
内部 class 包含对其外部 class 实例的隐藏引用。如果没有其他引用,则该隐藏引用会使外部 class 实例保持活动状态。
要查看实际效果,请获取此源代码并进行编译:
public class Outer {
public class Inner {
}
}
现在使用javaclass检查工具javap
查看隐藏参考:
$ javap -p Outer$Inner
Compiled from "Outer.java"
public class Outer$Inner {
final Outer this[=11=];
public Outer$Inner(Outer);
}
您会看到有一个名为 this[=13=]
的包范围隐藏引用,类型为 Outer
- 这就是我在上面谈到的引用。
Outer outer = new Outer();
在堆上创建了 Outer
class 的 Object
并且引用变量指向它。
如果我写的时候没看错的话
Outer.Inner inner=outer.new Inner();
Inner
class 的对象在堆上创建,inner
指向它。在堆中,我们有两个单独的对象,它们包含自己的实例变量。
但是如果我写
Outer.Inner inner=new Outer().new Inner();
仍然有两个 Object
会在堆上为 Outer
创建,另一个为 Inner
。但是参考 inner
只有 Inner
Object's
成员可以访问。谁指的是堆上的外部Object
?如果它没有被任何引用引用,那么它应该符合垃圾收集的条件,这将影响 inner
的使用。
自然地,inner 会保留它想要强引用的事物的强引用——就像它的另一半实例变量驻留在 Outer 中一样。
内部 class 的每个实例都持有对其外部 class 实例的引用。这是您在内部 class 方法之一中编写 Outer.this
时获得的参考。匿名 Outer
实例将不符合垃圾回收条件,除非与其关联的所有 Inner
实例也符合垃圾回收条件。
内部 class 包含对其外部 class 实例的隐藏引用。如果没有其他引用,则该隐藏引用会使外部 class 实例保持活动状态。
要查看实际效果,请获取此源代码并进行编译:
public class Outer {
public class Inner {
}
}
现在使用javaclass检查工具javap
查看隐藏参考:
$ javap -p Outer$Inner
Compiled from "Outer.java"
public class Outer$Inner {
final Outer this[=11=];
public Outer$Inner(Outer);
}
您会看到有一个名为 this[=13=]
的包范围隐藏引用,类型为 Outer
- 这就是我在上面谈到的引用。