java内部对象如何存在于内存堆中?

时间:2014-04-04 08:44:44

标签: java jvm heap inner-classes

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 个答案:

答案 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外层对象中。他们就像任何其他外部独立阶级一样。