Подтвердить что ты не робот

Как организована физическая память между экземплярами базового и производного классов в Java?

Когда создается подкласс C, он знает, что конструкторы его суперклассов (например, A и B (B extends A)) будут создаваться раньше, чем C. Значит ли это, что:

  • Есть отдельная память, выделенная для экземпляра A, экземпляра B и экземпляра C?
  • Для экземпляра подкласса C имеется ли у него вся физическая память, выделенная для полей, унаследованных от B и A, в дополнение к своим собственным полям?
  • и поэтому экземпляр B имеет физическую память для полей, унаследованных от A, в дополнение к своим собственным?
4b9b3361

Ответ 1

... он знал, что конструкторы его суперклассов (скажем, A и B (B продолжит A)) будут созданы...

Создаются классы. Вызывается конструкторы.

(В редакции было предложено, что это должно быть "Объекты создаются", однако это не является технически правильным. В одном разделе JLS, приведенном ниже: "Новый экземпляр класса явно создается при оценке класса выражение создания экземпляра вызывает экземпляр класса." То есть вы создаете экземпляр класса, чтобы получить объект. Объект - это экземпляр. Вы не создаете объекты.)

1) Есть отдельная память, выделенная для экземпляра A, экземпляра B и экземпляра C?

Нет, есть экземпляр класса. То есть один кусок памяти.

2) Для экземпляра подкласса C имеется ли вся физическая память, выделенная для полей, унаследованных от B и A, в дополнение к своим собственным полям?

Да: "Всякий раз, когда создается новый экземпляр класса, для него выделяется пространство памяти с комнатой для всех переменных экземпляра, объявленных в типе класса, и всех переменных экземпляра, объявленных в каждом суперклассе типа класса, включая весь экземпляр переменные, которые могут быть скрыты.

3), и поэтому экземпляр B имеет физическую память для полей, унаследованных от A в дополнение к своим собственным?

В соответствии с 1 в этом сценарии нет экземпляра "B". Там только один экземпляр.

Источник: 12.5. Создание экземпляров нового класса, JLS 7

Ответ 2

  • Выделяется только один экземпляр.
  • Этот экземпляр содержит все поля для всех классов.
  • Ну, единственный экземпляр C имеет память для полей, унаследованных от A и B.