2016-04-06 5 views
0

В соответствии с Java-учебным оракулом для инициализации статической переменной может использоваться частный статический метод. Мне просто интересно, когда будет выполнен public static varType myVar = initializeClassVariable();? Это во время создания экземпляра нового экземпляра класса Whatever или он инициализируется только при его первом использовании? Заранее благодарю за любую помощь!инициализация статической переменной с использованием частного статического метода

class Whatever { 
    public static varType myVar = initializeClassVariable(); 

    private static varType initializeClassVariable() { 

     // initialization code goes here 
    } 
} 
+0

Во время инициализации класса, смотри также [JLS-8.7. Статические инициализаторы] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.7) –

ответ

1

Как следует @ Эллиот-Фриша, простой ответ в JLS:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.7 https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2

Как только класс упоминается в запущенной программе загружается - что означает доступ к самому экземпляру class или создание нового экземпляра класса.

Загрузка класса включает сканирование пути к классам для контейнеров, которые могут содержать этот конкретный класс, считывая полученную банку и загружая/проверяя соответствующий байт-код из банки. Сделав это, идентифицируются и выполняются соответствующие классы инициализации класса класса. Все, что происходит до , вызывает экземпляр экземпляра класса.

Следует отметить, что все это ограничивается определенным загрузчиком классов. Несколько загрузчиков классов могут в конечном итоге выполнять одни и те же шаги для одного и того же класса в одно и то же время или в разное время. Таким образом, один и тот же статический инициализатор может выполняться несколько раз в одном JVM, хотя только один раз в одном экземпляре класса loadload.

В принципе - любая ссылка на класс вызывает загрузку класса, но загружаются только классы, на которые ссылаются. Просто потому, что ссылочный класс находится внутри банки, это не означает, что будут загружены другие классы в банке.

When does the JVM load classes?