Java 编译器可以为非静态方法做早期绑定吗?

假设我有以下课程:


public class MyClass {

    public void doSomething() {

        System.out.println("doing something.");

    }

}

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


MyClass myObj = new MyClass();

myObj.doSomething();

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


一只名叫tom的猫
浏览 72回答 1
1回答

炎炎设计

字节码编译器(如javac)通常不会对实例方法调用进行早期绑定:单独编译类的 Java 模型意味着这种优化只能在类调用其方法之一时应用。(如果javac假设跨类进行早期绑定,更改和重新编译一个类可能会导致绑定不正确。)没有太多价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。现代 JVM 中的 JIT 编译器根据已加载的完整类集(到目前为止)进行广泛的优化。这包括优化方法调度和内联方法调用。此外,JIT 编译器足够智能,可以跟踪关键优化,并在动态加载新类等导致先前优化无效时重新编译。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java