Java中的静态方法是否始终在编译时解决?
答案 0 :(得分:8)
是的,在Sun的论坛上通过这个主题进行了彻底的调查和解释:New To Java - No late binding for static methods
几个引言:
当编译器编译该类时,它在编译时决定为每个静态方法调用调用哪个精确方法(这与非静态方法调用有很大区别:要调用的确切方法仅在运行时决定)。
仅调用静态方法取决于调用它的编译时类型。
答案 1 :(得分: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 {
}
引发错误。
答案 2 :(得分:2)
简短回答:是
我无法找到Java Language Specification的确切部分。请帮忙。 :)