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 .