Когда инициализируются статические поля? Если я никогда не создаю экземпляр класса, но получаю доступ к статическому полю, ВСЕ ли статические блоки и частные статические методы, используемые для создания экземпляров частных статических полей, вызываются (по порядку) в этот момент?
Что, если я вызову статический метод? Он также запускает все статические блоки? До метода?
java
static
initialization
Тони Р
источник
источник
Ответы:
Статическая инициализация класса обычно происходит непосредственно перед первым возникновением одного из следующих событий:
для класса верхнего уровня выполняется оператор assert, лексически вложенный в класс1 .См. JLS 12.4.1 .
Также можно принудительно инициализировать класс (если он еще не инициализирован) с помощью
Class.forName(fqn, true, classLoader)
или короткой формыClass.forName(fqn)
1 - Последний пункт маркированного списка присутствовал в JLS для Java 6–8, но, по-видимому, это была ошибка в спецификации. Это было окончательно исправлено в Java 9 JLS: см. Исходный код .
источник
String
s заменяются и не упоминаются. Если вы ссылаетесь наclass Other { public static final int VAL = 10; }
какой-либо классMyClass { private int = Other.VAL; }
,Other
он не загружается. Вместо этого компилятор просто подставит последнее поле во время компиляции.String
переменных 'static final' , только для тех, которые инициализированы константным выражением.static
пока это обычное дело.Статические поля инициализируются во время «фазы» инициализации загрузки класса (загрузка, связывание и инициализация), которая включает статические инициализаторы и инициализации его статических полей. Статические инициализаторы выполняются в текстовом порядке, как определено в классе.
Рассмотрим пример:
Test.b печатается,
null
потому что приsayHello
вызове в статической области статическая переменнаяa
не была инициализирована.источник
Да, все статические инициализаторы запускаются перед первым обращением к классу. Если бы было иначе, я бы назвал это ошибкой.
источник