В этом случае 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
класс не выполнен?