Java中的静态方法是否始终在编译时解决?

8 java static-methods

Java中的静态方法是否始终在编译时解决?

Roe*_*ler 8

几个引用:

"当编译器编译该类时,它在编译时决定为每个静态方法调用调用哪个精确方法(这与非静态方法调用有很大区别:要调用的确切方法仅在运行时决定). "

"只调用静态方法取决于调用它的编译时类型."


Tom*_*ine 5

是的,但是如果静态方法已被运行时删除,则将调用基类中的匹配方法(名称和签名必须与编译时的原始方法完全匹配,并且该方法必须可由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)

引发错误.

  • "由运行时删除"?那是什么意思? (2认同)

dfa*_*dfa 2

简短回答:是的

我无法找到Java 语言规范的确切部分。请帮忙。:)