Статический блок против блока инициализации в 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();
    }
}

Мы понимаем, что сначала будет выполняться статический блок, за которым следует пустой блок. Но проблема в том, что я никогда не мог понять реальную полезность пустого блока. Может ли кто-нибудь показать реальный пример, в котором -

  • Используются как статические, так и пустые блоки
  • Оба статических и пустых блока имеют разные утилиты

Ответ 1

Они предназначены для двух совершенно разных целей:

  • Статический блок инициализатора будет вызываться при загрузке класса и не будет иметь доступа к переменным или методам экземпляра. Согласно комментарию @Prahalad Deshpande, он часто используется для создания статических переменных.
  • Нестатический блок инициализатора, с другой стороны, создается только при построении объекта, будет иметь доступ к переменным и методам экземпляра и (согласно важной поправке, предложенной @EJP), будет вызываться в начале конструктора, после того, как супер конструктор был вызван (явно или неявно) и перед вызовом любого другого последующего кода конструктора. Я видел, как он использовался, когда класс имеет несколько конструкторов и нуждается в том же коде инициализации, который требуется для всех конструкторов. Как и в случае с конструкторами, вы должны избегать вызова не конечных методов в этом блоке.

Обратите внимание, что на этот вопрос много ответов в stackoverflow, и вам было бы полезно искать и просматривать похожие вопросы и их ответы. Например: static-initialization-blocks

Ответ 2

Статический блок выполняется всякий раз, когда ваш класс загружается. Пустой блок выполняется всякий раз, когда вы создаете экземпляр класса. Попробуйте сравнить их:

1.

public static void main(String[] args) {
    Test t = new Test();
}

2.

public static void main(String[] args) {

}

Выходы:

1.

Статический блок
Пустой блок

2.

Статический блок

В словах Layman статический блок получает только один раз, независимо от того, сколько объектов этого типа вы создаете.