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

Измените print item на:

  • print item, в Python 2.7
  • print(item, end=" ") в Python 3

Если вы хотите распечатать данные динамически, используя следующий синтаксис:

  • print(item, sep=' ', end='', flush=True) в Python 3
107
задан user2864740 14 September 2015 в 04:39
поделиться

3 ответа

Статическая инициализация класса обычно происходит непосредственно перед первым появлением одного из следующих событий:

  • создается экземпляр класса,
  • вызывается статический метод класса,
  • присваивается статическое поле класса,
  • используется непостоянное статическое поле, или
  • для класса верхнего уровня выполняется утверждение assert, лексически вложенное в класс1.

См. JLS 12.4.1.

Также можно заставить класс инициализироваться (если он еще не инициализировался), используя Class.forName(fqn, true, classLoader) или краткую форму Class.forName(fqn)


1 - Последний пункт присутствовал в JLS для Java 6 и Java 8, но это, очевидно, была ошибка в спецификации. В конечном итоге он был исправлен в JLS для Java 9: см. source.

150
ответ дан 24 November 2019 в 03:42
поделиться

Статические поля инициализируются во время инициализации «фазы» загрузки класса (загрузки, связывания и инициализации), которая включает статические инициализаторы и инициализации его статических полей. Статические инициализаторы выполняются в текстовом порядке, как определено в классе.

Рассмотрим пример:

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 не была инициализирован.

13
ответ дан 24 November 2019 в 03:42
поделиться

Да, все статические инициализаторы запускаются перед первым обращением к классу. Если бы было иначе, я бы назвал это ошибкой.

1
ответ дан 24 November 2019 в 03:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: