Я не могу понять следующий текст... Означает ли это, что <clinit>
для пустых конструкторов? Почему важно иметь две разные версии?
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
2.9. Special Methods
На уровне виртуальной машины Java каждый конструктор (§2.12) появляется как метод инициализации экземпляра, который имеет специальное имя
<init>
. Это имя предоставляется компилятором. Поскольку имя<init>
не является допустимым идентификатором, его нельзя использовать непосредственно в программа, написанная на языке программирования Java. Пример методы инициализации могут быть вызваны только в виртуальном виртуальном Java по команде invokespecial, и они могут быть вызваны только на неинициализированных экземплярах класса. Метод инициализации экземпляра принимает права доступа (§2.7.4) конструктора, из которого он был получен.Класс или интерфейс имеет не более одного метода инициализации класса или интерфейса и инициализируется (§2.17.4), вызывая, что метод. Метод инициализации класса или интерфейса является статическим и не принимает аргументов. Он имеет специальное имя
<clinit>
. Это имя поставляемый компилятором. Поскольку имя<clinit>
недействительно идентификатор, он не может быть использован непосредственно в программе, написанной в Язык программирования Java. Методы инициализации класса и интерфейса вызываются неявно виртуальной машиной Java; они никогда вызывается непосредственно из любой виртуальной машины Java, но вызывается только косвенно как часть процесса инициализации класса.