Поле static без имена в классе

Что может значить эта конструкция?

class Name {
    static {
       //...
    }
}

Ответы (1 шт):

Автор решения: Михаил Ребров

Поле static без имена в классе

у этого поля нет имени, потому что это не статическое поле, а статический блок.

static {
    // ...
}

Он же называется статический инициализатор.
Блок кода, который помещен между этими фигурными скобками запускается, когда данный класс загружается в оперативную память.
Запускается он единожды, сколько бы вы с данным классом не работали.

Как следует из названия, данный блок используется для инициализации класса. Другими словами в нем находится код, который подготавливает все условия для нормальной работы данного класса


Замечание:

Помимо статического инициализатора существует еще НЕстатический инициализатор, и как следует из названия он подготавливает условия работы не для всего класса, а для конкретного его экземпляра.

Выглядит это также как и статический инициализатор, только без ключевого слова static

class Name {

    // статический инициализатор
    static {
        System.out.println("Я выполняюсь только один раз при загрузке класса в оперативную память");
    }

    // НЕстатический инициализатор
    {
        System.out.println("А я выполняюсь при создании каждого экземпляра");
    }
}

Порядок выполнения:

  1. Сначала выполняется статический инициализатор
  2. Потом при создании экземпляра класса выполняется НЕстатический инициализатор
  3. Потом при создании экземпляра класса выполняется конструктор
public class StaticBlockTest {
    // статический инициализатор
    static {
        System.out.println("Я выполняюсь только один раз при загрузке класса в оперативную память");
    }

    // НЕстатический инициализатор
    {
        System.out.println("А я выполняюсь при создании каждого экземпляра");
    }

    public StaticBlockTest() {
        System.out.println("Конструктор выполняется после НЕстатического инициализатора");
    }

    public static void main(String[] args) {
        new StaticBlockTest();
        new StaticBlockTest();
    }
}

Вывод:

Я выполняюсь только один раз при загрузке класса в оперативную память
А я выполняюсь при создании каждого экземпляра
Конструктор выполняется после НЕстатического инициализатора
А я выполняюсь при создании каждого экземпляра
Конструктор выполняется после НЕстатического инициализатора

введите сюда описание изображения

→ Ссылка