«1. Введение

В этом руководстве мы рассмотрим процесс инициализации статической переменной. Виртуальная машина Java (JVM) следует этому процессу во время загрузки класса.

2. Процесс инициализации

На высоком уровне JVM выполняет следующие шаги:

Сначала класс загружается и компонуется. Затем на этапе «инициализации» этого процесса выполняется инициализация статической переменной. Наконец, вызывается основной метод, связанный с классом.

В следующем разделе мы рассмотрим инициализацию переменных класса.

3. Переменная класса

В Java статические переменные также называются переменными класса. То есть они принадлежат классу, а не конкретному экземпляру. В результате инициализация класса будет инициализировать статические переменные.

Напротив, экземпляр класса инициализирует переменные экземпляра (нестатические переменные). Все экземпляры класса совместно используют статические переменные класса.

Давайте рассмотрим пример класса StaticVariableDemo:

public class StaticVariableDemo {  
    public static int i;
    public static int j = 20;

    public StaticVariableDemo() {}
}

Сначала JVM создает объект Class для класса StaticVariableDemo. Затем инициализаторы статических полей присваивают статическим полям значимое значение по умолчанию. В нашем примере выше переменная класса i сначала инициализируется нулевым значением по умолчанию int.

Текстовый порядок применяется к статическим полям. Сначала я инициализирую, а затем j будет инициализирован. После этого класс и его статические члены будут видны другим классам.

4. Переменная в статическом блоке

Возьмем другой пример:

public class StaticVariableDemo {  
    public static int z;

    static {
        z = 30;
    }
    public StaticVariableDemo() {}
}

В этом случае инициализация переменной будет последовательной. Например, JVM сначала присваивает переменной z значение int по умолчанию, равное 0. Затем в статическом блоке оно изменяется на 30.

5. Переменная в статическом вложенном классе

Наконец, давайте рассмотрим пример вложенного класса внутри внешнего класса StaticVariableDemo:

public class StaticVariableDemo {  
    public StaticVariableDemo() {}
    
    static class Nested {
        public static String nestedClassStaticVariable = "test";
    }
}

В этом случае класс StaticVariableDemo загружает класс Nested. Он инициализирует статическую переменную nestedClassStaticVariable.

6. Заключение

В этой короткой статье мы кратко объяснили инициализацию статической переменной. Дополнительные сведения см. в Спецификации языка Java.

Как всегда, фрагменты кода доступны на GitHub.