выделение памяти для класса в Java?

#java #memory #inheritance #object

#java #память #наследование #объект

Вопрос:

класс B наследует класс A. Теперь, когда мы создаем объект типа B, какая память выделяется для B? Включает ли оно A и B или любую другую процедуру выделения памяти?

Ответ №1:

Когда вы создаете объект B, скажем, вызывая конструктор по умолчанию

 B myObject = new B();
  

Затем JVM выделяет объект с более или менее:

  • Достаточно памяти для каждого поля, явно объявленного в B (обычно около 4-8 байт на поле, но оно сильно зависит от типов и хост-системы)
  • Достаточно памяти для каждого возможного поля, унаследованного A и его предками
  • Достаточно памяти, чтобы содержать ссылку на вектор отправки (который также должен составлять около 4-8 байт)

Вектор отправки используется компилятором для хранения адреса каждого метода, который может быть вызван для данного объекта, и это зависит от класса объекта, а не от экземпляра самого объекта (в конце концов, каждый объект B имеет один и тот же интерфейс!)

Итак, вам НЕ нужно выделять A, потому что нет отдельного объекта A. Вы не создаете экземпляры 2 отдельных объектов. Когда вы создаете B, вы создаете «специализированную» версию A .. которую можно рассматривать как A с чем-то большим. Таким образом, нужно выделить только B (но имейте в виду, что у B также есть все, что есть у его предков)

Ответ №2:

Да. Объекты типа B содержат часть A, когда они выделяются. Не нужно беспокоиться об этом (а именно, нет необходимости выделять как B, так и A).

Комментарии:

1. A является частью B объекта. Когда вы создаете объект типа B , его макет памяти содержит макет памяти A . Итак new B() , это все, что вам нужно. Если A имеет int член, а у B есть другой int член, при создании a B он будет содержать оба int s .

Ответ №3:

Когда вы создаете экземпляр B через new B() , неявный (или явный) вызов выполняется для конструктора A. Таким образом, выделение памяти выполняется для обоих классов.

Более конкретно, если A объявляет три целых члена, а B (расширяет A) объявляет 2 члена с плавающей запятой, каждый новый B будет выделять три целых числа и два числа с плавающей запятой.

Комментарии:

1. Конструктор не выполняет выделение памяти. Выделение памяти выполняется JVM перед вызовом конструкторов.