2010-05-31 2 views
272

Я просматривал некоторый код на другой день, и я наткнулся на:Статический блок в Java

static { 
    ... 
} 

Исходя из C++, я понятия не имел, почему это было там. Это не ошибка, потому что код скомпилирован. Что это за «статический» блок кода?

+0

Проверьте это: [Статическое ключевое слово в java] (http: // programergate.com/static-keyword-java /) –

ответ

298

Это static initializer. Он выполняется, когда класс загружается (или инициализирован, если быть точным, но вы обычно не замечаете разницы).

Его можно рассматривать как «конструктор класса».

Обратите внимание, что есть также instance initializers, которые выглядят одинаковыми, за исключением того, что у них нет ключевого слова static. Они запускаются в дополнение к код в конструкторе при создании нового экземпляра объекта.

+9

Итак, почему бы вам использовать инициализаторы нестатического экземпляра, а не просто использовать конструктор классов (я могу думать, что это полезно в анонимных классах)? – Jori

+47

@Jori: общая причина заключается в том, что у вас есть несколько отдельных конструкторов (которые * не просто «перенаправляют» на один канонический), и вы хотите, чтобы все из них имели общую инициализацию. –

+2

Делает код более четким и менее повторяющимся. Люди, которые делают спецификации Java, иногда делают вещи более запутанными, но почти всегда есть основная причина того, почему они это сделали. Поток манипуляции, кто-нибудь? – Mindwin

66

Это блок кода, который выполняется, когда класс загружается загрузчиком классов. Он предназначен для инициализации статических членов класса.

Также можно написать нестатические инициализаторы, которые выглядят еще более странно:

public class Foo { 
    { 
     // This code will be executed before every constructor 
     // but after the call to super() 
    } 

    Foo() { 

    } 
} 
+1

Это выглядит как ** нормальный ** конструктор. –

+9

@DerGolem Я думаю, что он ссылается на фигурные скобки над нормальным конструктором. – saadq

+3

Даже не заметил, что ...;) Да, странно! –

84

Это статический инициализатор. Он выполняется, когда класс загружен и является хорошим местом для инициализации статических переменных.

От http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html

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

Если у вас есть класс со статическим справочной картой она может выглядеть следующим образом

class MyClass { 
    static Map<Double, String> labels; 
    static { 
     labels = new HashMap<Double, String>(); 
     labels.put(5.5, "five and a half"); 
     labels.put(7.1, "seven point 1"); 
    } 
    //... 
} 

Это полезно, так как выше статическое поле не может быть инициализировано с помощью labels = .... Ему нужно как-то вызвать put-method.

+0

@aioobe Я понимаю, что это может быть необязательно, но никто не узнает о статических инициализаторах, не подвергаясь их воздействию. Кроме того, в некоторых случаях инициализация членов класса в декларации не рекомендуется (некоторые компании, над которыми я работал) и инициализация их внутри статического блока или конструктора (для нестатических членов) была рекомендуемой практикой. – Mindwin

+0

Я вижу. Почему это обескураживает? Лично я считаю, что инициализация члена в декларации довольно легко читается и поддерживается. Я бы сказал, что принудительное включение их в конструкторы может быть плохой идеей, особенно если у вас есть несколько конструкторов и нужно повторить инициализацию. (Если вы, например, меняетесь с ArrayList на LinkedList, вам необходимо запомнить его в нескольких местах.) – aioobe

+0

Как вы сказали, нам нужно повторить код инициализации в каждом конструкторе. Было бы лучше, если бы мы инициализировали их в инициализаторах экземпляра. – user12458

3

Статические блоки используются для инициализации кода и будут выполняться, когда JVM загружает класс. Обратитесь к приведенной ниже ссылке, которая дает подробное объяснение. http://www.jusfortechies.com/java/core-java/static-blocks.php

6

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

14

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

//static block 
//static block is used to initlize static data member of the clas at the time of clas loading 
//static block is exeuted before the main 
class B 
{ 
    static 
    { 
     System.out.println("Welcome to Java"); 
     System.exit(0); 
    } 
} 
+6

это верно только до версии 7, где вы обязаны написать основную информацию, если хотите запустить код. – XFCC

-2

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

Статический блок используется в предыдущих версиях Java, но в последней версии он не работает.

+2

нет, когда запускается JVM, но когда класс загружен. JVM использует механизм загрузки класса, поэтому он загружает класс, когда он используется, а не раньше и никогда, когда запускается JVM – 4lberto

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