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();
}
}
当我们通过外部类对象创建一个内部类对象时,它们如何在堆中相互关联?
答案 0 :(得分:3)
基本上,编译器隐式创建一个构造函数,该构造函数引用外部类,该外部类存储在隐藏字段中。所以你的代码有点像这样:
class Outer {
int o = 10;
static class Inner {
private final Outer outer;
int i = 20;
Inner(Outer outer) {
this.outer = outer;
}
}
}
public class Demo {
public static void main(String args[]) {
Outer o = new Outer();
Outer.Inner oi = new Outer.Inner(o);
}
}
(请注意,我已将内部类转换为静态嵌套类。)
答案 1 :(得分:0)
我认为Jon Skeet已经说明了逻辑内部类(即包含在任何外部类中的内部类)对外部类的引用。
但是,我想以不同的方式呈现它。根据标准书" Java编程语言,第4版"作者:James Gosling和他:
非静态嵌套类称为内部类。非静态类成员与类的实例相关联。非静态字段是实例变量。
类似地,内部类也(通常)与"实例"相关联。一个类,或者更具体地说是一个内部类的实例"与....关联 封闭类的实例。
因此,如果堆中存在外层类的对象,则相关的内部类对象也将存在。
但是,我不认为静态嵌套类必然存在于堆IN ASSOCIATION WITH外层对象中。他们就像任何其他外部独立阶级一样。