#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
член, при создании aB
он будет содержать обаint
s .
Ответ №3:
Когда вы создаете экземпляр B через new B()
, неявный (или явный) вызов выполняется для конструктора A. Таким образом, выделение памяти выполняется для обоих классов.
Более конкретно, если A объявляет три целых члена, а B (расширяет A) объявляет 2 члена с плавающей запятой, каждый новый B будет выделять три целых числа и два числа с плавающей запятой.
Комментарии:
1. Конструктор не выполняет выделение памяти. Выделение памяти выполняется JVM перед вызовом конструкторов.