Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java编译器可以对非静态方法进行早期绑定吗?_Java_Late Binding_Early Binding - Fatal编程技术网

Java编译器可以对非静态方法进行早期绑定吗?

Java编译器可以对非静态方法进行早期绑定吗?,java,late-binding,early-binding,Java,Late Binding,Early Binding,假设我有以下课程: 公共类MyClass{ 公共无效剂量测定法(){ System.out.println(“做某事”); } } 让我们进一步假设,我的项目所做的就是调用.something()方法。没有凌驾或任何其他有趣的事情发生 MyClass myObj=newmyclass(); myObj.doSomething(); javac编译器是否注意到这个方法调用没有被重写,并优化绑定到“早期绑定”?我问是出于好奇;在任何现实世界的应用程序中,我当然会将final、static和pri

假设我有以下课程:

公共类MyClass{
公共无效剂量测定法(){
System.out.println(“做某事”);
}
}
让我们进一步假设,我的项目所做的就是调用
.something()
方法。没有凌驾或任何其他有趣的事情发生

MyClass myObj=newmyclass();
myObj.doSomething();
javac
编译器是否注意到这个方法调用没有被重写,并优化绑定到“早期绑定”?我问是出于好奇;在任何现实世界的应用程序中,我当然会将
final
static
private
散布在我的代码中。

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

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

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


  • 现代JVM中的JIT编译器根据已加载的完整类集(到目前为止)进行广泛的优化。这包括优化离开方法调度和内联方法调用。此外,JIT编译器足够智能,可以跟踪关键优化,并在动态加载新类等情况下使以前的优化无效时重新编译。

    答案当然取决于您使用的编译器。。。但是,要将编译器视为java编译器并不需要这样做,我机器上的编译器也不需要这样做。如果使用
    类加载器
    运行时加载一个类,该类扩展
    MyClass
    并重写
    doSomething()
    ,会发生什么?