класс B наследует класс A. Теперь, когда мы создаем объект типа B, какова память, выделенная для B? Включает ли он A и B или любую другую процедуру для выделения памяти?
Когда вы создаете объект B, скажем, вызывая конструктор по умолчанию
B myObject = new B();
Затем JVM выделяет объект более или менее:
Вектор отправки используется компилятором для хранения адреса каждого метода, который может быть вызван для данного объекта, и зависит от класса объекта, а не от экземпляра самого объекта (каждый объект B имеет тот же самый интерфейс в конце концов!)
Поэтому вам не нужно выделять A, потому что нет отдельного объекта A. Вы не создаете 2 отдельных объекта. Когда вы создаете B, вы создаете "специализированную" версию A.., которую можно рассматривать как A с чем-то большим. Поэтому нужно выделить только B (но имейте в виду, что B также имеет все, что есть у его предков)
Когда вы управляете B через new B()
, неявный (или явный) вызов выполняется конструктору A. Таким образом, распределение памяти выполняется для обоих классов.
В частности, если A объявляет три целочисленных члена, а B (расширяет A) объявляет 2 члена float, каждый новый B будет выделять три ints и два поплавка.
Да. Объекты типа B содержат часть A, когда они выделены. Не нужно беспокоиться об этом (а именно, не нужно выделять B и A).
B
объекта. Когда вы создаете объект типа B
, его макет памяти содержит макет памяти A
Итак, new B()
- это все, что вам нужно. Если A
имеет член int
, а B имеет другой член int
, при создании B
он будет содержать оба типа int
.