Создание объектов в цепочке конструктора с наследованием.rt - PullRequest
1 голос
/ 15 июня 2019

Когда мы создаем экземпляр класса, он автоматически так или иначе вызывает конструктор суперкласса.В Inheritance, когда мы создаем экземпляр дочернего класса, он также имеет ссылку на поля родительского класса, которая невидима, как это указывает на ссылку на поле родительского класса на дочерний класс в области кучи?Например, когда мы создаем экземпляр любого класса (A ref = new A ();), объект создается в памяти кучи (new A ()), которая является ссылкой на ссылку, присутствующую в области стека (ref).

Аналогично, если я создаю n экземпляров класса, означает ли это, что я создаю n разных экземпляров класса Object?Поскольку каждый класс расширяет класс Object по умолчанию.

Ответы [ 2 ]

4 голосов
/ 15 июня 2019

Предположим, что у некоторого класса B есть несколько закрытых полей x и y.Чтобы выполнить «свою работу», чтобы обеспечить желаемое поведение при вызове методов на B, эти поля, конечно, должны существовать в «области памяти», выделенной для экземпляра B.

Теперь, когда Bрасширяется на C, тогда, конечно, когда вы создаете экземпляр C, эти поля x и y также должны быть выделены.Вы правы в этом.

Но: это не означает, что вы создаете экземпляр "дополнительного" объекта B для C. Это просто означает, что когда JVM выделяет память для экземпляра C, она знает, что должно быть место дляунаследованные поля x и y.

И наконец: класс Object не имеет какие-либо поля.Поэтому нет никаких дополнительных затрат памяти «потому что что-то расширяет объект».

1 голос
/ 15 июня 2019

Может быть или нет (но, вероятно, нет). Это полностью зависит от конкретной JVM.

Обычно для каждого экземпляра объекта, содержащего тип, методы и данные, выделяется только одна таблица.

См. https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.7 для Oracle JVM:

2,7. Представление объектов

Виртуальная машина Java не требует какой-либо конкретной внутренней структуры для объектов.

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

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