public class Test15 {
public static void main(String[] args) {
System.out.println(B.x);
}
}
abstract class A {
static int x=99;
A() {
System.out.println("A DC");
}
static {
System.out.println("A SB");
}
}
class B extends A {
static {
System.out.println("B Sb");
}
}
为什么在上述程序中未执行子类静态块?
答案 0 :(得分:4)
x
是类static
的{{1}}变量,因此即使您通过A
访问它,也不需要初始化类B.x
。因此,不会执行类B
的{{1}}初始化程序。
以下是相关的JLS 12.4.1 quote:
对静态字段的引用(第8.3.1.1节)仅导致实际声明它的类或接口的初始化,即使它可能是通过子类,子接口或实现的类的名称来引用的接口。
答案 1 :(得分:0)
B
的静态块仅在初始化类B
时执行。调用其超类x
的领域A
不会导致类B
的初始化。
根据Java规范:
12.4.1发生初始化时
类或接口类型T将在以下任何一种首次出现之前立即初始化:
•T是一个类,并且创建了T的一个实例。
•T是一个类,并调用T声明的静态方法。
•分配了由T声明的静态字段。
•使用了由T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。
•T是顶级类(第7.6节),并且执行了一个词法嵌套在T(第8.1.3节)中的断言语句(第14.10节)。