Java中的内部对象是否有引用?

时间:2011-03-05 19:02:13

标签: java memory reference jvm

如果您有以下内容:

class MyClass {

    private class InnerClass {

    } 
}

在java中。是4字节引用的开销的内部类,还是在内存中与父类连续?为了澄清,另外它是否有4个字节的通用对象开销信息?

“普通”java类有8个字节的开销,4个字节的引用加上4个字节的关于对象的其他信息,内部类也有8个字节吗?

3 个答案:

答案 0 :(得分:2)

内部类就像在创建它们时在堆上分配的常规类,并且当时会发生任何内存分配。内部类需要知道它的父类。

更新根据您在下面的评论 - 所以技术上内部类就像我上面提到的普通类一样,因此在创建/使用它时会占用内存。此外,如果你的内部类中有静态成员,它将添加一些内存使用,因为内部类将有一个类对象。

这会回答你的问题吗?

答案 1 :(得分:2)

使用javap

对内部类进行编译
class MyClass$InnerClass extends java.lang.Object{
    final MyClass this$0;
    MyClass$InnerClass(MyClass);
}

答案 2 :(得分:1)

在你的例子中

class MyClass {
    private class InnerClass {
    } 
}

创建MyClass对象不会自动创建InnerClass对象,因此该对象不能“始终位于外部对象内”。更重要的是,您可以为每个MyClass对象创建任意数量的InnerClass对象,因此MyClass对象无法为所有这些对象提供足够的空间。

//                                      numbers: MyClass  InnerClass
MyClass m = new MyClass();                 //        1         0
MyClass.InnerClass i = m.new InnerClass(); //        1         1
MyClass.InnerClass[] array =
   new MyClass.InnerClass[20];             //        1         1
for(int i = 0; i < 20; i++) {
   array[i] = m.new InnerClass();
}                                          //        1        21

MyClass对象可以在任何其他对象可以使用的地方使用,因此需要它们 普通物体所需的所有正常信息。

因此,InnerClass的对象与普通类的对象具有相同的开销,甚至还有一个引用(对于非静态内部类),因为每个内部对象都需要知道它的外部对象。