Что делает JVM, когда «новый» оператор инициализирует память с помощью конструктора?

17
RealEstate v = new RealEstate();

Я использовал ключевое слово new с RealEstate() . Я знаю, что new выделяет память и инициализирует память с помощью конструктора класса RealEstate .

Что здесь делает JVM?

    
задан Shahab Khan 20.08.2016 в 16:34
источник
  • Я не чувствую, что этот вопрос должен иметь 6 downvotes, скорее всего, downvoters не понимали, что действительно спрашивал OP. Надеюсь, 6 пользователей сражались, чтобы противостоять downvotes. –  Jean-François Savard 20.08.2016 в 17:04
  • @EJP Я не вижу, как вопрос содержит его собственный ответ? –  Jean-François Savard 21.08.2016 в 02:30
  • @EJP Я понимаю, но OP фактически спрашивал, как инициализируется память при вызове нового оператора. Можно было бы предположить, что JVM будет делать malloc, когда сталкивается с новой инструкцией байткода, например. Комментарий по eckes на ответ - это ответ, насколько я понимаю. –  Jean-François Savard 21.08.2016 в 03:16
  • @EJP Мне «Как этот оператор инициализировал память» спрашивает, как распределение выполняется на более низком уровне. Надеюсь, OP подтвердит. –  Jean-François Savard 21.08.2016 в 04:00
  • @EJP Я думаю, что вы не правильно прочитали вопрос. Можете сказать, что на самом деле Jvm делает, когда новый оператор инициализирует память с помощью конструктора? –  Shahab Khan 21.08.2016 в 04:57
Показать остальные комментарии

1 ответ

13
Оператор

new фактически не использует помощь конструктора для выделения памяти. Это не имеет никакого отношения к конструктору. В основном версия Java malloc new .

Оператор

new :

  • выделяет память для объекта
  • вызывает конструктор объектов
  • возвращает ссылку на эту память

Конструктор выполняется отдельно для выполнения любых операций во время инициализации, таких как выделение значений объектам и переменным. Если конструктор не определен, компилятор будет создавать конструктор по умолчанию и будет выделять значения по умолчанию:

В следующей таблице представлены значения по умолчанию для нескольких типов данных. источник

Data Type   Default Value (for fields)
byte            0
short           0
int             0
long            0L
float           0.0f
double          0.0d
char            '\u0000'
String          null
any object      null
boolean         false

Таким образом, оператор new выделяет только память и возвращает ссылку на эту память.

Смотрите документацию :

  

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

    
ответ дан Raman Sahasi 20.08.2016 в 16:39
  • Нет, Java не использует malloc для каждого объекта. На самом деле это намного меньше накладных расходов, в основном увеличивая указатель в области, называемой TLAB (поток локального буфера распределения). Далее будет указано в спецификации языка Java, в том числе запуск инициализаторов и конструкторов класса hierachy. И прежде всего строится и подкрепляется и класс актуала для объекта. docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 –  eckes 20.08.2016 в 16:45
  • Сначала он выделяет память, затем вызывает конструктор, а затем возвращает ссылку. Конструктор по умолчанию создается компилятором, а не JVM. Вы не учитываете значения по умолчанию для целочисленных полей, и нет необходимости указывать значение по умолчанию для String, что является еще одним объектом. Заявление цитируется из учебника Java, а не «документации». Правильная вещь для цитирования - спецификация языка Java. –  EJP 21.08.2016 в 01:48
  • @EJP Я только хотел указать основные операции, которые выполняются во время инициализации. Это не должно было быть точного порядка, в котором они выполняются. В любом случае, спасибо за уведомление, я обновил свой ответ соответственно. Что касается описания диаграмм значений по умолчанию, он знает, что это не какая-то надлежащая документация, но в конце концов, она все еще из оракула. поэтому я думаю, что ему можно доверять. –  Raman Sahasi 21.08.2016 в 05:10