4

假设我有以下课程:

public class MyClass {
    public void doSomething() {
        System.out.println("doing something.");
    }
}

让我们进一步假设,我的项目所做的就是调用该.something()方法。没有压倒一切或任何其他有趣的事情发生。

MyClass myObj = new MyClass();
myObj.doSomething();

编译器是否javac注意到此方法调用没有被覆盖,并将绑定优化为“早期绑定”?我是出于好奇而问的;在任何现实世界的应用程序中,我当然会在我的代码中撒上final,static和。private

4

1 回答 1

3

字节码编译器(如javac)通常不会对实例方法调用进行早期绑定:

  1. Java 的类单独编译模型意味着这种优化只能在类调用其方法之一时应用。(如果javac假设在类之间进行了早期绑定,那么更改和重新编译一个类可能会导致绑定不正确。)

  2. 没有太大的价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。

现代 JVM 中的 JIT 编译器基于已加载的完整类集(到目前为止)进行了广泛的优化。这包括优化方法分派和内联方法调用。此外,JIT 编译器足够聪明,可以跟踪关键优化,并在动态加载新类等使之前的优化无效时重新编译。

于 2019-07-10T15:15:39.593 回答