Когда происходит инициализация статического classа?
Когда инициализируются статические поля? Если я никогда не создавал экземпляр classа, но я обращаюсь к статическому полю, ВСЕ ВСЕ статические блоки и частные статические методы, используемые для создания экземпляров частных статических полей, называемых (в порядке) в этот момент?
Что, если я вызову статический метод? Он также запускает все статические блоки? До метода?
- Список полезных настроек среды в Java
- Включение зависимостей со статическим регистратором, статическим вспомогательным classом
- C ++ инициализирует статические переменные в classе?
- Содержит ли сборщик мусора статические переменные или методы в java?
- Android: статическая переменная null на низкой памяти
- Что такое «статическая» функция?
- Статические переменные в функциях-членах
- Несинхронизированные статические методы streamобезопасны, если они не изменяют переменные статического classа?
- Инициализация статических переменных в C
- Связаны ли статические переменные между streamами?
- Статическая функция перегрузки C ++ с нестатической функцией
- Являются ли функции статических переменных streamобезопасными в GCC?
- В терминах laymans, что означает «статический» в Java?
Статическая инициализация classа обычно происходит непосредственно перед тем, как произойдет одно из следующих событий:
- создается экземпляр classа,
- вызывается статический метод classа,
- статическое поле classа назначается,
- используется непостоянное статическое поле или
-
для classа верхнего уровня выполняется инструкция assert, лексически вложенная в class.1 .
См. JLS 12.4.1 .
Также можно принудительно инициализировать class (если он еще не инициализирован) с использованием Class.forName(fqn, true, classLoader)
или короткой формы Class.forName(fqn)
1 – Конечная маркерная точка присутствовала в JLS для Java 6 через Java 8, но это было, по-видимому, ошибкой в спецификации. Он был наконец исправлен в Java 9 JLS: см. Источник .
Статические поля инициализируются во время «фазы» инициализации загрузки classа (загрузка, связывание и инициализация), который включает в себя статические инициализаторы и инициализации его статических полей. Статические инициализаторы выполняются в текстовом порядке, как определено в classе.
Рассмотрим пример:
public class Test { static String sayHello() { return a; } static String b = sayHello(); // a static method is called to assign value to b. // but its a has not been initialized yet. static String a = "hello"; static String c = sayHello(); // assignes "hello" to variable c public static void main(String[] arg) throws Throwable { System.out.println(Test.b); // prints null System.out.println(Test.sayHello()); // prints "hello" } }
Test.b печатает null
потому что когда sayHello
вызывается в статической области, статическая переменная a
не была инициализирована.
Да, все статические инициализаторы запускаются до того, как вы впервые получите доступ к classу. Если бы это было иначе, я бы назвал это ошибкой.