如果您有以下内容:
class MyClass {
private class InnerClass {
}
}
在java中。是4字节引用的开销的内部类,还是在内存中与父类连续?为了澄清,另外它是否有4个字节的通用对象开销信息?
“普通”java类有8个字节的开销,4个字节的引用加上4个字节的关于对象的其他信息,内部类也有8个字节吗?
答案 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的对象与普通类的对象具有相同的开销,甚至还有一个引用(对于非静态内部类),因为每个内部对象都需要知道它的外部对象。