Учитывая следующие классы:
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, а статический метод, объявленный S, вызывается на T.