Java中的静态方法总是在编译时解析吗?
Joao Luis
问问题
7261 次
3 回答
8
是的,在 Sun 论坛上的这个线程中对其进行了彻底的调查和解释:Java 新手 - 静态方法没有后期绑定
几个引用:
当编译器编译该类时,它会在编译时决定为每个静态方法调用调用哪个确切的方法(这是与非静态方法调用的最大区别:在这些情况下,要调用的确切方法仅在运行时决定)。
调用静态方法只取决于调用它的编译时类型。
于 2009-06-24T16:00:17.500 回答
5
是的,但是如果静态方法已被运行时删除,则将调用基类中的匹配方法(名称和签名必须与编译时的原始方法完全匹配,并且该方法必须可以通过 JVM 规范规则访问)。
为了澄清,考虑调用代码:
Derived.fn();
以下调用代码:
class Base {
public static void fn() {
System.err.println("Base");
}
}
class Derived extends Base {
public static void fn() {
System.err.println("Derived");
}
}
打印Derived
。
现在,我编译所有内容。然后重新编译刚刚Derived改为:
class Derived extends Base {
}
打印Base
。
也许然后我重新编译刚刚 Derived 更改为:
class Derived {
}
引发错误。
于 2009-06-24T15:56:55.893 回答
2
简短的回答:是的
我无法找到Java Language Specification的确切部分。请帮忙。:)
于 2009-06-24T15:53:09.607 回答