«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.