Каково различие между помехами и нестатическим блоком кода инициализации

345
задан Raedwald 2 November 2018 в 03:10
поделиться

5 ответов

Блок кода со статическим модификатором имеет значение инициализатор класса ; без статического модификатора блок кода экземпляр инициализатор.

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

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

, Если Вы удаляете static от int a, это становится переменной экземпляра, к которой Вы не в состоянии получить доступ от статического блока инициализатора. Это не скомпилирует с ошибкой "нестатическую переменную банка не быть сосланным от статического контекста".

, Если Вы также удаляете static из блока инициализатора, это тогда становится инициализатором экземпляра и таким образом int a инициализируется в конструкции.

390
ответ дан Michael 23 November 2019 в 00:31
поделиться

static блок является "статическим инициализатором".

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

я лично только когда-либо использовал его при записи кода JNI:

class JNIGlue {
    static {
        System.loadLibrary("foo");
    }
}
55
ответ дан Alnitak 23 November 2019 в 00:31
поделиться

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

12
ответ дан DJClayworth 23 November 2019 в 00:31
поделиться

Вы не запишете код в статический блок, который должен быть вызван где угодно в Вашей программе. Если цель кода состоит в том, чтобы быть вызвана тогда, необходимо поместить его в метод.

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

А статический блок инициализатора похож на метод без имени, никаких аргументов и никакого типа возврата. Так как Вы никогда не называете его, этому не нужно имя. Единственное время, которое - его названный, когда виртуальная машина загружает класс.

7
ответ дан Vincent Ramdhanie 23 November 2019 в 00:31
поделиться

Статический блок кода может использоваться, чтобы инстанцировать или инициализировать переменные класса (в противоположность переменным объекта). Так объявляя "a" статическое средство, которое является, только один совместно использованный всеми Тестовыми объектами и статическим блоком кода инициализирует "a" только однажды, когда Тестовый класс сначала загружается, неважно, сколько Тестовых объектов создается.

4
ответ дан Paul Tomblin 23 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: