2011-12-18 11 views
13

Говорят, что статические блоки в java запускаются только один раз, когда этот класс загружается. Но что это значит? В какой момент это класс, загруженный JVM (виртуальная машина Java)?Что означает «Когда класс загружен» на самом деле означает?

Это когда основной метод в этом классе называется? И разве все суперклассы одного и того же класса также загружаются при запуске основного метода?

Учтите, что A расширяет B и B продолжается C. Все имеют статические блоки. Если A имеет основной метод, то какова будет последовательность выполнения статических блоков?

ответ

9

Это описано в разделе Execution JLS. А именно:

Инициализация класса состоит из выполнения его статических инициализаторов и инициализаторов для статических полей, объявленных в классе. Инициализация интерфейса состоит в выполнении инициализаторов для полей, объявленных в интерфейсе.
Прежде чем инициализировать класс, его прямой суперкласс должен быть инициализирован, но интерфейсы, реализованные классом, не должны быть инициализированы. Аналогично, суперинтерфейсы интерфейса не нужно инициализировать до инициализации интерфейса.

Таким образом, в вашем примере, статический блок «верхнего» класс (C) проходит первый, то, что из B, то наиболее производных один.

См. Документацию для подробного описания всех шагов, которые входят в загрузку класса.

(. Классы загружаются, когда они впервые активно используются)

1

От Java Language Specification:

Инициализация класса состоит из выполнения его статические инициализаторы и инициализаторы для статических полей (переменных класса) объявлен в классе. Инициализация интерфейса состоит в выполнении инициализаторов для объявленных там полей (констант).

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

Процесс описан более подробно в Java Virtual Machine Specification.

1

Я думаю, что следующий пример будет решать все ваши проблемы:

Перед тем, как класс инициализируется, его суперкласс инициализируется, если они ранее не были инициализированы.

Таким образом, программа испытаний:

class Super { 
     static { System.out.print("Super "); } 
} 
class One { 
     static { System.out.print("One "); } 
} 
class Two extends Super { 
     static { System.out.print("Two "); } 
} 
class Test { 
     public static void main(String[] args) { 
       One o = null; 
       Two t = new Two(); 
       System.out.println((Object)o == (Object)t); 
     } 
} 

печатает:

Super Two false 

Класс, один никогда не инициализируется, потому что она активно не используется, и поэтому никогда не связана.Второй класс инициализируется только после инициализации суперкласса Super.

Для получения более подробной информации посетите этот link

Редактировать данные: Удалены запутанные линии.

+0

«Сразу после запуска JVM» не является точным описанием этого процесса. См. Другие ответы. Downvote. – EJP

+0

Восхитили эти запутанные строки –

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