Статический блок против блока инициализатора в Java?
Возможный дубликат:
Статические блоки инициализации
Рассмотрим следующий код:
public class Test {
{
System.out.println("Empty block");
}
static {
System.out.println("Static block");
}
public static void main(String[] args) {
Test t = new Test();
}
}
Мы понимаем, что сначала будет выполнен статический блок, а затем пустой блок. Но проблема в том, что я никогда не мог понять реальную полезность пустого блока. Может ли кто-нибудь показать реальный пример, в котором -
- Используются как статические, так и пустые блоки.
- Как статические, так и пустые блоки имеют разные утилиты
2 ответа
Они предназначены для двух совершенно разных целей:
- Статический блок инициализатора будет вызываться при загрузке класса и не будет иметь доступа к переменным или методам экземпляра. Согласно комментарию @Prahalad Deshpande, он часто используется для создания статических переменных.
- Нестатический блок инициализатора, с другой стороны, создается только при построении объекта, будет иметь доступ к переменным и методам экземпляра и (согласно важному исправлению, предложенному @EJP) будет вызываться в начале конструктора, после супер-конструктор был вызван (явно или неявно) и до вызова любого другого последующего конструкторского кода. Я видел, как он используется, когда класс имеет несколько конструкторов и ему нужен один и тот же код инициализации, который вызывается для всех конструкторов. Как и в случае с конструкторами, вы должны избегать вызова не финальных методов в этом блоке.
Обратите внимание, что на этот вопрос много раз отвечали в stackru, и вам было бы неплохо найти и просмотреть похожие вопросы и ответы на них. Например: статические блоки инициализации
Статический блок выполняется всякий раз, когда ваш класс загружается. Пустой блок выполняется всякий раз, когда вы создаете экземпляр своего класса. Попробуйте сравнить это:
1.
public static void main(String[] args) {
Test t = new Test();
}
2.
public static void main(String[] args) {
}
Выходы:
1.
Статический блок
Пустой блок
2.
Статический блок
В словах Layman, статический блок вызывается только один раз, независимо от того, сколько объектов этого типа вы создаете.