Когда происходит инициализация статического classа?

Когда инициализируются статические поля? Если я никогда не создавал экземпляр classа, но я обращаюсь к статическому полю, ВСЕ ВСЕ статические блоки и частные статические методы, используемые для создания экземпляров частных статических полей, называемых (в порядке) в этот момент?

Что, если я вызову статический метод? Он также запускает все статические блоки? До метода?

Статическая инициализация 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у. Если бы это было иначе, я бы назвал это ошибкой.

  • Когда статические определения функций в файлах заголовков в C?
  • Почему NoClassDefFoundError вызвано сбоем инициализации статического поля?
  • Когда инициализируются статические и глобальные переменные?
  • Статическая строковая переменная в Objective C на iphone
  • Java: статический class?
  • Когда инициализируются статические переменные?
  • Статические переменные в C ++
  • Stack, Static и Heap в C ++
  • Когда инициализируются статические члены classа C ++?
  • @Автоматический и статический метод
  • Давайте будем гением компьютера.