2013-09-30 3 views
2

Я всегда думал, что загрузка классов и инициализация классов являются синонимами и обычно выполняются по требованию, когда инициализированный/загруженный класс используется в some way or the other for the first time. Но теперь я знаю от this answer on SO regarding the behavior of final static fileds that holds compile time constants, что мое убеждение неверно.Загрузка класса с инициализацией класса

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

В боковой точки, обратите внимание на различие между классом загрузки и инициализации класса: появление только последний является именно задается JLS. Загрузка классов может произойти в любое время.

Но может кто-то объяснить разницу между загрузкой классов и инициализацией класса на языке Java. Обычно интуиция говорит, что инициализации всегда должна предшествовать загрузка, но я совершенно ошибаюсь. Может ли инициализация произойти без загрузки класса?

+1

[Перейдите к главе 12 JLS.] (Http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1) В частности, 12.2 и 12.4. –

+2

Также [Глава 5 спецификаций виртуальной машины Java] (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html) –

ответ

7

Из Java Virtual Machine Specification, Chapter 5. Loading, Linking, and Initializing, вы можете найти эту информацию (emphasys шахты):

5.5. Инициализация

До инициализации класс или интерфейс должен быть связан, то есть проверен, подготовлен и, при необходимости, разрешен.

Переход назад к Linking секции

5.4. Связывание

Связывание класса или интерфейса включает в себя проверку и подготовку этого класса или интерфейса, его прямого суперкласса, его прямых суперинтерфейсов и его типа элемента (если это тип массива), при необходимости. Разрешение символических ссылок в классе или интерфейсе является необязательной частью связывания. Эта спецификация позволяет гибкость реализации, как, когда увязывания деятельности (и, из-за рекурсии, погрузка) имеют место, при условии, что все следующие свойства сохраняются:

  • класс или интерфейс полностью загружен до она связана

Таким образом, мы можем сделать вывод, что должен быть загружен класс или интерфейс перед тем инициализации.

+0

«Разрешение« символических ссылок »в классе или интерфейс является необязательной частью связывания ». Вы можете объяснить это, пожалуйста? – Geek

+0

@Geek ссылается на http://stackoverflow.com/q/17406159/1065197 –

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