繁体   English   中英

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

[英]Does an Internal Object in Java have a Reference?

如果您有类似以下内容:

class MyClass {

    private class InnerClass {

    } 
}

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

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

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

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

这回答了你的问题了吗?

只需使用javap反编译InnerClass

class MyClass$InnerClass extends java.lang.Object{
    final MyClass this$0;
    MyClass$InnerClass(MyClass);
}

在你的例子中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM