Привет, у меня тут возник вопрос ради общего развития: кто-нибудь может
объяснить, почему при доступе к статическим членам класса вызывается инициализация класса, в котором член объявлен, а не тот, к которому мы обращаемся?
Вот что говорит JVM Specification (§5.5):
Upon execution of a getstatic, putstatic, or invokestatic instruction, the class or interface that declared the resolved field or method is initialized if it has not been initialized already.
Следующий пример подтверждает это и выводит 37 (инициализатор
Bar
не вызывается вообще):
class Foo {
public static int x;
static {
x = 37;
}
}
class Bar extends Foo {
static {
x = 42;
}
}
public class test {
public static void main(String args[]) {
System.out.println(Bar.x);
}
}
Т.е. интересна именно мотивация, почему сделано так?