我正在学习核心java中的静态块功能。
public class ClassResolution {
static class Parent {
public static String name = "Sparsh";
static {
System.out.println("this is Parent");
name = "Parent";
}
}
static class Child extends Parent {
static {
System.out.println("this is Child");
name = "Child";
}
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(Child.name);
}
}
我认为输出将是:
this is Parent
this is Child
Child
但实际输出是:
this is Parent
Parent
我不明白为什么。
答案 0 :(得分:14)
由于name
是在Parent
类中声明的静态字段,因此在main
方法中访问它(即使使用Child
类名作为前缀来访问它)导致Parent
类被初始化。 Child
类未初始化。
因此显示"this is Parent"
(因为Parent
的静态初始化程序块已执行),"this is Child"
不显示(因为{的静态初始化程序段} {1}} 未已执行)且Child
的打印值为name
。
以下是相关的JLS参考:
12.4。类和接口的初始化
类的初始化包括执行其静态 初始化器和静态字段的初始化器(类变量) 在课堂上宣布。
接口的初始化包括执行初始化器 对于在接口中声明的字段(常量)。
12.4.1。初始化发生时
类或接口类型T将在紧接之前初始化 首次出现以下任何一种情况:
T是一个类,并创建了一个T实例。
调用T声明的静态方法。
分配由T声明的静态字段。
使用T声明的静态字段,该字段不是常量变量(§4.12.4)。
T是顶级类(§7.6),并且执行词汇嵌套在T(§8.1.3)中的断言语句(§14.10)。