这是来自 JLS 部分 8.4.8.2 的简短示例。
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 是否有明确的目标,即每个编译器都生成行为完全相同的字节码,还是有其他原因?