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

2

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

Теги:
object
inheritance
memory

3 ответа

1
Лучший ответ

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

B myObject = new B();

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

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

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

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

1

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

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

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

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

  • 0
    Так нет памяти для А?
  • 2
    Является частью B объекта. Когда вы создаете объект типа B , его макет памяти содержит макет памяти A Итак, new B() - это все, что вам нужно. Если A имеет член int , а B имеет другой член int , при создании B он будет содержать оба типа int .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню