Вот краткий пример из раздела 8.4.8.2 JLS.
class Super {
static String greeting() { return "Goodnight"; }
String name() { return "Richard"; }
}
class Sub extends Super {
static String greeting() { return "Hello"; }
String name() { return "Dick"; }
}
class Test {
public static void main(String[] args) {
Super s = new Sub();
System.out.println(s.greeting() + ", " + s.name());
}
}
Согласно обсуждению примера, результатом работы main()
будет «Спокойной ночи, Дик». Это связано с тем, что статические методы вызываются на основе статического типа переменной/выражения, для которых они вызываются.
Вот мой вопрос :Любой компилятор, даже умеренно чувствительный к потоку -, может выяснить, что тип любого объекта, хранящегося в s
во время вызова, всегда должен быть Sub
, поэтому, если бы компилятору было разрешено использовать эта информация, даже вызов статических методов, может иметь некоторое ощущение динамической привязки. Почему это не разрешено? Есть ли у Java явная цель, чтобы каждый компилятор создавал байт-код, который ведет себя точно так же, или есть какая-то другая причина?