Перейти к основному содержимому

Когда статические переменные инициализируются в Java?

· 2 мин. чтения

1. Введение

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

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

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

./3d372a83bd92f4854b7134740c0cd399.jpg

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

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

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 .