Вопрос-ответ

Static Block in Java [duplicate]

Статический блок в Java [дубликат]

На днях я просматривал кое-какой код и наткнулся:

static {
...
}

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

Переведено автоматически
Ответ 1

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

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

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

Ответ 2

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

От 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-метод.

Ответ 3

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

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

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

Foo() {

}
}
Ответ 4

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

//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);
}
}
java