Когда будет инициализирован статический класс? - PullRequest
2 голосов
/ 20 февраля 2012

Рассмотрим класс 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 Ответ

5 голосов
/ 20 февраля 2012

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

JVMS утверждает, что

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

Далее

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

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

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

...