2012-02-20 7 views
2

Рассмотрим Java class with static fields only и не конструктор:Когда будет инициализирован статический класс?

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 ини tialized? При импорте или когда compute() вызывается в первый раз?

+0

http://java.sun.com/docs/books/jls/third_edition/html/execution.html#44557 – MByD

ответ

5

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

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

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

Further

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

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

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

+0

Исправлено статическое объявление. Что вы подразумеваете под этим? При импорте или при первом вызове? –

+0

«... не ленивый». Строго говоря, это неверно. Класс 'OnlyStatic' лениво загружается JVM. Но статические поля инициализируются сразу во время загрузки класса. –

+0

@ A.H. - это класс, сначала загруженный при импорте или при вызове метода? –

Смежные вопросы