Конструктор ставил jvm или компилятор? - PullRequest
0 голосов
/ 17 октября 2019

Я где-то читал, что вызов конструктора - это работа JVM, поэтому я создал класс с именем Hello и вообще ничего не ставил, а просто скомпилировал его, после компиляции при открытии байтового кода внутри конструктора создается конструктор. класс, который является конструктором по умолчанию. Так что обязанность компилятора поместить конструктор по умолчанию. Я думал, что JVM проверяет и вызывает конструктор. PS: я не запускал этот код.

Ответы [ 3 ]

4 голосов
/ 17 октября 2019

Я думал, что jvm проверяет и вызывает конструктор.

Неправильное предположение. JVM читает файлы скомпилированных классов (.class). Он не изменяет и не добавляет их.

Конечно, JVM выполняет код и, таким образом, вызывает / вызывает методы и конструкторы.

Но компилятор java отвечает за "добавление" таких вещей в конструктор по умолчанию, подробнее см. здесь .

Сказав, что, конечно, есть JIT (как раз во время компилятора), который является частью JVM. Но JIT преобразует байт-код в машинный код, и его задача снова состоит в том, чтобы не добавлять такие вещи, как дополнительные конструкторы.

0 голосов
/ 28 октября 2019

Я пытаюсь понять, что вы подразумеваете под:

Я думал, что это jvm проверяет и вызывает конструктор.

"Вызов" имеет смысл.

"Чек" .... не уверен. Если вы имеете в виду, что загрузчик классов JVM проверяет, присутствуют ли необходимые конструкторы, когда он загружает 1 класс, это правильно. Но если JVM обнаружит, что конструктор (по умолчанию или нет) отсутствует, он не просто добавляет его. Вместо этого JVM помечает класс и его зависимые объекты как непригодные для использования, генерирует исключение Error и обычно завершает работу.

(Обратите внимание, что описанные выше проверки выполняются в случаях, когда существует двоичная совместимостьнесоответствие между версиями классов, используемых во время компиляции и во время выполнения. Как правило, вы скомпилировали класс для одной версии API и использовали и поместили несовместимую версию в путь к классам времени выполнения.)


Проверка того, чтоВы вероятно думаете, что это делается компилятором байт-кода.

  • Если в исходном коде класса нет конструктора, компилятор определяет конструктор по умолчанию,и включает его в .class файл. Это соответствует тому, что говорит JLS.

  • Если исходный код содержит new, который использует любой конструктор, который не был определен, компиляторобрабатывает это как ошибку компиляции.

К тому времени, когда JVM увидит любой файл байт-кода для класса Java, он будет содержать хотя бы один конструктор.


1 - Я намеренно опускаю некоторые детали здесь.

0 голосов
/ 17 октября 2019

Конструктор по умолчанию автоматически генерируется компилятором, если вы явно не определяете хотя бы один конструктор в своем классе. Вы определили два, так что ваш класс не имеет конструктора по умолчанию. Конструктор по умолчанию создается, если вы не определяете никаких конструкторов в своем классе. Это просто конструктор без аргументов, который ничего не делает. Изменить: За исключением вызова супер ()

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