выделение памяти для класса в Java? - PullRequest
3 голосов
/ 06 октября 2011

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

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

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

B myObject = new B();

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

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

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

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

1 голос
/ 06 октября 2011

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

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

1 голос
/ 06 октября 2011

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

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