几个引用:
"当编译器编译该类时,它在编译时决定为每个静态方法调用调用哪个精确方法(这与非静态方法调用有很大区别:要调用的确切方法仅在运行时决定). "
"只调用静态方法取决于调用它的编译时类型."
是的,但是如果静态方法已被运行时删除,则将调用基类中的匹配方法(名称和签名必须与编译时的原始方法完全匹配,并且该方法必须可由JVM规范规则访问).
为了澄清,请考虑调用代码:
Derived.fn();
Run Code Online (Sandbox Code Playgroud)
以下称为代码:
class Base {
public static void fn() {
System.err.println("Base");
}
}
class Derived extends Base {
public static void fn() {
System.err.println("Derived");
}
}
Run Code Online (Sandbox Code Playgroud)
打印Derived.
现在,我编译所有内容.然后重新编译Derived更改为:
class Derived extends Base {
}
Run Code Online (Sandbox Code Playgroud)
打印Base.
也许那时我重新编译只是Derived改为:
class Derived {
}
Run Code Online (Sandbox Code Playgroud)
引发错误.
| 归档时间: |
|
| 查看次数: |
5699 次 |
| 最近记录: |