Когда будет инициализирован статический класс?
Рассмотрим класс 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()
впервые выполняется.