Почему статический блок не выполняется

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

Может ли кто-нибудь сказать мне, почему статический блок не выполняется, когда я запускаю код ниже?

class A {
    static {
        System.out.println("Static Block");
    }
}

public class Main {

    public static void example1() {
        Class<?> class1 = A.class;
        System.out.println(class1);
    }


    public static void example2() {
        try {
            Class<?> class1 = Class.forName("ClassLoading_Interview_Example.ex1.A");
            System.out.println(class1);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

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

2 ответа

Решение

Статическая инициализация класса обычно происходит непосредственно перед первым случаем одного из следующих событий:

  • экземпляр класса создан,
  • вызывается статический метод класса,
  • статическое поле класса назначено,
  • используется непостоянное статическое поле, или [...]

Вы в настоящее время не делаете ничего из вышеперечисленного. Итак, заменив

Class<?> class1 = A.class;
System.out.println(class1);

с этим например

A object = new A();

даст вам ваш результат.

Привязка A.class не приведет к выполнению Aстатические инициализаторы, смотрите здесь

Инициализация класса состоит из выполнения его статических инициализаторов и инициализаторов для статических полей (переменных класса), объявленных в классе.

А также

Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым появлением любого из следующего:

T является классом, и экземпляр T создан.

Статический метод, объявленный T, вызывается.

Статическое поле, объявленное T, присваивается.

Используется статическое поле, объявленное T, и поле не является константной переменной (§4.12.4).

Другие вопросы по тегам