jvm java内部类对象是如何存在于内存堆中的?

w1jd8yoj  于 2022-11-07  发布在  Java
关注(0)|答案(2)|浏览(128)
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();
    }
}

当我们通过一个外部类对象创建一个内部类对象时,它们在堆中是如何相互关联的?

xzlaal3s

xzlaal3s1#

基本上,编译器隐式地创建一个引用外部类的构造函数,它存储在一个隐藏字段中。所以你的代码有点像这样:

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);
    }
}

(Note我已经将内部类转换为静态嵌套类。)

h7appiyu

h7appiyu2#

我认为Jon Skeet已经说明了逻辑内部类(即包含在任何外部类中的类)具有对外部类的引用这一点。
然而,我想以不同的方式来介绍它。根据James Gosling和co的标准书籍“Java编程语言,第4版”:
非静态嵌套类被称为内部类。非静态类成员与类的示例相关联。非静态字段是示例变量。
类似地,内部类也(通常)与类的“示例”相关联,或者更具体地说,“内部类的示例”与其封闭类的 * 示例 * 相关联。
因此,如果外部级别类的对象存在于堆中,则相关联的内部类对象也将存在。
然而,我不认为静态嵌套类一定会出现在堆中,与外部类的对象相关联。它们就像任何其他外部独立类一样。

相关问题