Статический блок против блока инициализатора в 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, статический блок вызывается только один раз, независимо от того, сколько объектов этого типа вы создаете.

Другие вопросы по тегам