Когда будет инициализирован статический класс?

Рассмотрим класс Java только со статическими полями и без конструктора:

public class OnlyStatic {
   static O1 o1 = new o1();
   static O2 o2 = new o2();

   public static int compute(int whatever) {
       return o1.foo+o2.bar+whatever;
   }
}

В другом классе метод compute используется либо static import:

static import OnlyStatic.compute
int a = OnlyStatic.compute(3);

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

int a = OnlyStatic.compute(3);

Когда инициализируются o1 и o2? При импорте или когда compute() вызывается впервые?

1 ответ

Решение

Объекты o1 а также o2 недоступны для вашего static контекст, не делая их static также.

JVMS заявляет, что

Любые статические инициализаторы, объявленные в классе, выполняются при инициализации класса.

В дальнейшем

Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым появлением любого из следующего:

  • T является классом, и экземпляр T создан.
  • T является классом, и вызывается статический метод, объявленный T.
  • Статическое поле, объявленное T, присваивается.
  • Используется статическое поле, объявленное T, и поле не является константной переменной (§4.12.4).
  • T является классом верхнего уровня, и выполняется оператор assert (§14.10), лексически вложенный в T.

Так в вашем случае, когда статический метод compute() впервые выполняется.

Другие вопросы по тегам