给出以下代码:
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,以便这种“手动重载解析”不会产生性能开销?或者实际的运行时执行是否仍会执行强制转换?
答案 0 :(得分:4)
在编译时选择该调用。因此,编译器本身选择调用哪种方法并不是一种优化。转换是为了帮助编译器,不会影响运行时性能。
这与覆盖的区别不同,在覆盖中,被调用的对象在运行时指示方法,例如
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
将在每种情况下改变,以反映不同的方法)。
答案 1 :(得分:1)
您担心的性能下降到底有多大?我很好奇你的情况是什么,以至于你认为这可能有任何明显的影响,因为我一百年都不会担心这会减慢我的应用程序的速度?
实际上说:为什么不开发一个同时运行强制转换和直接调用的基准应用程序,看看你是否在几百万次迭代中有任何差异?