class Outer {
int o = 10;
class Inner {
int i = 20;
}
}
public class Demo {
public static void main(String args[]) {
Outer o = new Outer();
Outer.Inner oi = o.new Inner();
}
}
当我们通过一个外部类对象创建一个内部类对象时,它们在堆中是如何相互关联的?
2条答案
按热度按时间xzlaal3s1#
基本上,编译器隐式地创建一个引用外部类的构造函数,它存储在一个隐藏字段中。所以你的代码有点像这样:
(Note我已经将内部类转换为静态嵌套类。)
h7appiyu2#
我认为Jon Skeet已经说明了逻辑内部类(即包含在任何外部类中的类)具有对外部类的引用这一点。
然而,我想以不同的方式来介绍它。根据James Gosling和co的标准书籍“Java编程语言,第4版”:
非静态嵌套类被称为内部类。非静态类成员与类的示例相关联。非静态字段是示例变量。
类似地,内部类也(通常)与类的“示例”相关联,或者更具体地说,“内部类的示例”与其封闭类的 * 示例 * 相关联。
因此,如果外部级别类的对象存在于堆中,则相关联的内部类对象也将存在。
然而,我不认为静态嵌套类一定会出现在堆中,与外部类的对象相关联。它们就像任何其他外部独立类一样。