Я пытаюсь понять, что вы подразумеваете под:
Я думал, что это jvm проверяет и вызывает конструктор.
"Вызов" имеет смысл.
"Чек" .... не уверен. Если вы имеете в виду, что загрузчик классов JVM проверяет, присутствуют ли необходимые конструкторы, когда он загружает 1 класс, это правильно. Но если JVM обнаружит, что конструктор (по умолчанию или нет) отсутствует, он не просто добавляет его. Вместо этого JVM помечает класс и его зависимые объекты как непригодные для использования, генерирует исключение Error
и обычно завершает работу.
(Обратите внимание, что описанные выше проверки выполняются в случаях, когда существует двоичная совместимостьнесоответствие между версиями классов, используемых во время компиляции и во время выполнения. Как правило, вы скомпилировали класс для одной версии API и использовали и поместили несовместимую версию в путь к классам времени выполнения.)
Проверка того, чтоВы вероятно думаете, что это делается компилятором байт-кода.
Если в исходном коде класса нет конструктора, компилятор определяет конструктор по умолчанию,и включает его в .class файл. Это соответствует тому, что говорит JLS.
Если исходный код содержит new
, который использует любой конструктор, который не был определен, компиляторобрабатывает это как ошибку компиляции.
К тому времени, когда JVM увидит любой файл байт-кода для класса Java, он будет содержать хотя бы один конструктор.
1 - Я намеренно опускаю некоторые детали здесь.