为什么在子类上调用在其超类中声明的静态方法时,不调用该子类的静态初始值设定项?
给定以下类:
public abstract class Super {
protected static Object staticVar;
protected static void staticMethod() {
System.out.println( staticVar );
}
}
public class Sub extends Super {
static {
staticVar = new Object();
}
// Declaring a method with the same signature here,
// thus hiding Super.staticMethod(), avoids staticVar being null
/*
public static void staticMethod() {
Super.staticMethod();
}
*/
}
public class UserClass {
public static void main( String[] args ) {
new UserClass().method();
}
void method() {
Sub.staticMethod(); // prints "null"
}
}
我不是针对诸如“因为它在JLS中是这样指定的”之类的答案。我知道这是,因为JLS,12.4.1当初始化发生时,只读:
类或接口类型 T 将在首次出现以下任一项之前立即初始化:
...
T 是一个类,调用由 T 声明的静态方法。
...
我感兴趣的是,为什么没有这样的句子,是否有充分的理由:
- T 是 S 的子类,在 T 上调用 S 声明的静态方法。