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
)通常不会对实例方法调用进行早期绑定:
javac
假设跨类进行早期绑定,那么更改和重新编译一个类可能会导致绑定不正确。)现代JVM中的JIT编译器根据已加载的完整类集(到目前为止)进行广泛的优化。这包括优化离开方法调度和内联方法调用。此外,JIT编译器足够智能,可以跟踪关键优化,并在动态加载新类等情况下使以前的优化无效时重新编译。答案当然取决于您使用的编译器。。。但是,要将编译器视为java编译器并不需要这样做,我机器上的编译器也不需要这样做。如果使用
类加载器
在运行时加载一个类,该类扩展MyClass
并重写doSomething()
,会发生什么?