В этом случае Child.age эквивалентен Parent.age. JRE будет рассматривать его как Parent.age, поэтому статически инициализируется только Parent, а статический инициализатор Child пропускается.

овлюсь к сертификационному тесту Java и обнаружил интересный вопрос, связанный с выполнением статических блоков Java. Я потратил много времени на чтение этой темы, но не нашел ответа, который искал.

Я знаю, что статические блоки выполняются, когда класс загружается в JVM или когда вызывается метод main, но ...

package oneClassTasks;

class Parent {
    static int age;
}

class Child extends Parent {
    static {
        age = 5;
        System.out.println("child's static block");
    }
}

public class XXX {

    public static void main(String args[]) {
        System.out.println("Child age is : "+ Child.age);
    }

}

Выход:

Child age is : 0

Если я включу подробный вывод с-verbose:class, тогда вывод:

...
[Loaded java.security.BasicPermissionCollection from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded oneClassTasks.XXX from file:/D:/temp/bin/]
[Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Class$MethodArray from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Void from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded oneClassTasks.Parent from file:/D:/temp/bin/]
[Loaded oneClassTasks.Child from file:/D:/temp/bin/]
Child age is : 0
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]

Мы можем видеть здесь, чтоДочерний класс загружен в JVM.

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

Ответы на вопрос(2)

Ваш ответ на вопрос