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

Согласно 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();
    }
}

person Sridhar Srinivasan    schedule 16.03.2018    source источник


Ответы (2)


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

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

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

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

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

A object = new A();

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

person Nikiforos    schedule 16.03.2018
comment
Итак, что произойдет, когда я выполню эту строку Class‹?› class1 = A.class;. Не будет ли JVM загружать класс A? - person Sridhar Srinivasan; 16.03.2018
comment
@SridharSrinivasan Если вы выполните эту строку, JVM загрузит класс, но не будет его инициализировать, поскольку инициализация класса происходит в соответствии с набором правил (см. мою цитату выше), и это не включено в эти правила. - person Nikiforos; 16.03.2018

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

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

А также

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

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

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

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

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

person xingbin    schedule 16.03.2018