Внутренний объект в Java имеет ссылку? - PullRequest
4 голосов
/ 05 марта 2011

Если у вас было что-то вроде следующего:

class MyClass {

    private class InnerClass {

    } 
}

В Java.Имеет ли внутренний класс издержки на 4-байтовую ссылку, или это смежно в памяти с родительским классом?Чтобы уточнить, кроме того, имеет ли он 4 байта общей служебной информации об объекте?

«Нормальный» класс Java имеет 8 байтов служебной информации, 4-байтовая ссылка плюс 4 байта другой информации об объекте,внутренний класс также имеет 8 байтов этого?

Ответы [ 3 ]

2 голосов
/ 05 марта 2011

Просто декомпилируйте InnerClass, используя javap

class MyClass$InnerClass extends java.lang.Object{
    final MyClass this$0;
    MyClass$InnerClass(MyClass);
}
2 голосов
/ 05 марта 2011

Внутренние классы похожи на обычные классы, которые выделяются в куче при их создании, и любое выделение памяти для этого произойдет в это время. Внутренний класс должен знать свой родительский класс.

ОБНОВЛЕНИЕ Исходя из вашего комментария ниже - так что технически внутренние классы похожи на обычные классы, как я уже упоминал выше, так что вы будете подвергаться использованию памяти при ее создании / использовании. Также, если у вас есть статические члены во внутреннем классе, это добавит некоторое использование памяти, так как для внутреннего класса будет объект класса.

Это отвечает на ваш вопрос?

1 голос
/ 05 марта 2011

В вашем примере

class MyClass {
    private class InnerClass {
    } 
}

создание объекта MyClass не создает автоматически объект InnerClass, поэтому объект не может быть «всегда внутри внешнего объекта».Более того, вы можете создавать любое количество объектов InnerClass для каждого объекта MyClass, поэтому у объекта MyClass не может быть достаточно места для всех этих объектов.может использоваться, поэтому им нужна вся обычная информация, необходимая и для обычных объектов.

Таким образом, объекты InnerClass имеют такие же издержки, что и объекты обычных классов, и даже дополнительно одну ссылку больше (длястатические внутренние классы), поскольку каждый внутренний объект должен знать свой внешний объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...