Точное время инициализации класса указано в Спецификации языка Java®, §12.4.1
§12.4.1.Когда происходит инициализация
Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым возникновением любого из следующего:
T
- это класс и экземпляр T
создано. - Вызван метод
static
, объявленный T
. - A
static
поле, объявленное T
, назначено. - A
static
поле, объявленное T
, используется, и поле не является константной переменной ( §4.12.4 ). T
является классом верхнего уровня (§7.6 ) и оператор assert
( §14.10 ), лексически вложенный в T
( §8.1.3 ), выполняется.
Когда класс инициализируется, инициализируются его суперклассы (если они не были предварительно инициализированы), а также любые суперинтерфейсы ( §8.1.5 ), которые объявляют любые методы по умолчанию ( §9.4.3 ) (если они не были предварительно инициализированы).Инициализация интерфейса сама по себе не вызывает инициализацию любого из его суперинтерфейсов.
Последний маркер был удален в Java 9
Времякласса загрузка не является фиксированной и может зависеть от деталей реализации, например, от того, как был реализован верификатор.Но очевидно, что это должно произойти до инициализации.
С точки зрения JVM, тот факт, что это вложенный класс, не имеет особого значения.Существует символическая ссылка на внутренний класс во внешнем классе ' константный пул , как и для любого другого ссылочного класса.Это будет разрешено при необходимости.