Это статический инициализатор . Он выполняется, когда класс загружен (или, если быть точным, инициализирован, но обычно вы не замечаете разницы).
Его можно рассматривать как «конструктор класса» .
Обратите внимание, что существуют также инициализаторы экземпляров , которые выглядят одинаково, за исключением того, что в них нет ключевого слова static
. Они запускаются в дополнение к коду в конструкторе при создании нового экземпляра объекта.
Это блок кода, который выполняется, когда класс загружается загрузчиком классов. Он предназначен для инициализации статических членов класса.
Также можно писать нестатические инициализаторы, которые выглядят еще более странно:
public class Foo {
{
// This code will be executed before every constructor
// but after the call to super()
}
Foo() {
}
}
Это статический инициализатор. Он выполняется, когда класс загружен, и это хорошее место для инициализации статических переменных.
Из 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.