我正在准备 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
类没有执行?
你看到了Child
类已加载,但尚未初始化。
访问Child.age
不会导致初始化Child
类,从age
是的成员Parent
班级。因此仅Parent
类被初始化,并且age
遗迹0
.
12.4.1.初始化发生时
类或接口类型 T 将在紧接之前初始化
第一次出现以下任一情况:
在您的情况下,您访问了由以下声明的静态字段Parent
,所以只有Parent
已初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)