Блок кода со статическим модификатором имеет значение инициализатор класса ; без статического модификатора блок кода экземпляр инициализатор.
инициализаторы Класса выполняются в порядке, они определяются (вершина вниз, точно так же, как инициализаторы простой переменной), когда класс загружается (на самом деле, когда это разрешено, но это - техническая особенность).
инициализаторы Экземпляра выполняются в порядке, определенном, когда класс инстанцируют, сразу прежде чем код конструктора выполнен, сразу после вызова супер конструктора.
, Если Вы удаляете static
от int a
, это становится переменной экземпляра, к которой Вы не в состоянии получить доступ от статического блока инициализатора. Это не скомпилирует с ошибкой "нестатическую переменную банка не быть сосланным от статического контекста".
, Если Вы также удаляете static
из блока инициализатора, это тогда становится инициализатором экземпляра и таким образом int a
инициализируется в конструкции.
static
блок является "статическим инициализатором".
Это автоматически вызывается, когда класс загружается, и нет никакого другого способа вызвать его (даже через Отражение).
я лично только когда-либо использовал его при записи кода JNI:
class JNIGlue {
static {
System.loadLibrary("foo");
}
}
"финал" гарантирует, что переменная должна быть инициализирована перед концом объектного кода инициализатора. Аналогично "статический финал" гарантирует, что переменная будет инициализирована к концу кода инициализации класса. Исключение "помех" от Вашего кода инициализации превращает его в объектный код инициализации; таким образом Ваша переменная больше не удовлетворяет свои гарантии.
Вы не запишете код в статический блок, который должен быть вызван где угодно в Вашей программе. Если цель кода состоит в том, чтобы быть вызвана тогда, необходимо поместить его в метод.
можно записать статические блоки инициализатора для инициализации статических переменных, когда класс загружается, но этот код может быть более сложным..
А статический блок инициализатора похож на метод без имени, никаких аргументов и никакого типа возврата. Так как Вы никогда не называете его, этому не нужно имя. Единственное время, которое - его названный, когда виртуальная машина загружает класс.
Статический блок кода может использоваться, чтобы инстанцировать или инициализировать переменные класса (в противоположность переменным объекта). Так объявляя "a" статическое средство, которое является, только один совместно использованный всеми Тестовыми объектами и статическим блоком кода инициализирует "a" только однажды, когда Тестовый класс сначала загружается, неважно, сколько Тестовых объектов создается.