给出以下代码:
class C {
static void m(String s) { ... } // 1
static void m(Object o) { ... } // 2
public static void main(String[] args) {
m( (Object) "test"); // call m version 2
}
}
Java 编译器是否会优化对 Object i main 的强制转换,以便这种“手动重载决策”不会产生性能开销?或者实际运行时执行仍会执行强制转换吗?
该调用是在“编译”时选择的。因此,与其说这是一种优化,不如说是编译器本身选择调用哪个方法。转换是为了帮助编译器,不会影响运行时性能。 这与覆盖不同,在覆盖中,被调用的对象在运行时指示方法,例如
shape.getArea(); // determined by whether shape is a square, circle etc.
如果您在使用/不使用强制转换的情况下编写上述内容并生成字节码(
javap -verbose -c C
),您将在生成的代码中看到这种差异:
< 2: invokestatic #7; //Method m:(Ljava/lang/Object;)V
---
> 2: invokestatic #7; //Method m:(Ljava/lang/String;)V
即编译器只是选择了不同的方法(
const #7
在每种情况下都会改变以反映不同的方法)。
实际上来说:为什么不开发一个同时运行强制转换和直接调用的基准应用程序,看看在几百万次迭代后是否有任何差异?