Блок инициализации всегда называется независимо от конструктора, который вы хотели бы использовать. Итак, если в рассматриваемом классе имеется более одного конструктора, и вы хотите запустить некоторый код независимо от используемого конструктора, используйте блок инициализации.
Однако, когда используется для назначения значений по умолчанию, я просто назначаю их напрямую. Если они даже являются константами , то я бы добавил final
в список модификаторов.
private static final String VAL1 = "VALUE";
Обновление , так как вы резко изменили вопрос, вот обновленный ответ:
1) Где вы чаще всего использовали блок инициализации?
Для выполнения некоторого кода независимо от используемого конструктора.
2) Можете ли вы использовать их для присвоения значений статическим переменным экземпляра?
Вам понадобится static
блок инициализатора.
private static final String FOO;
static {
FOO = "bar";
}
Преимущество этого заключается в том, что вы можете сделать больше, чем просто присвоить значение. Например. получить его из некоторого метода и обработать исключение:
static {
try {
FOO = getItSomehow();
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
3) Чем это отличается от назначения с помощью конструктора?
Он всегда назначается независимо от используемого конструктора.
4) Моя книга говорит, что блок инициализации выполняется, когда «класс загружен». Что означает загрузка класса?
Книга на самом деле говорит о статическом блоке инициализации. Класс обычно загружается, когда вы впервые ссылаетесь на него в своем коде. Вы также можете принудительно загрузить его с помощью Class#forName()
(как, например, драйверы JDBC). Я отправил ответ с большим количеством примеров и объяснений до здесь .
Надеюсь, это поможет.