[英]Execution of Java static blocks in subclasses
我正准备自己进行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]
我们可以在这里看到Child类被加载到JVM中。
有人可以解释为什么不执行Child
类中的静态块吗?
您看到Child
类已加载,但未初始化。
访问Child.age
不会导致Child
类的初始化,因为age
是Parent
类的成员。 因此,只初始化Parent
类,并且age
仍为0
。
类或接口类型T将在第一次出现以下任何一个之前立即初始化:
T是一个类,并且创建了T的实例。
调用由T声明的静态方法。
分配由T声明的静态字段。
使用由T声明的静态字段,该字段不是常量变量(第4.12.4节) 。
T是顶级类(第7.6节),并且执行在词典内嵌套在T(第8.1.3节)内的断言语句(第14.10节)。
在您的情况下,您访问了Parent
声明的静态字段,因此只初始化Parent
。
在这种情况下,Child.age等同于Parent.age。 JRE会将其视为Parent.age,这就是为什么只有Parent被静态初始化,并跳过Child的静态初始化程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.