我有以下代码,我需要对重载概念进行一些澄清。
class Overload{
static void print(Object o){
System.out.println("object");
}
static void print(String s){
System.out.println("string");
}
public static void main(String...args){
print("Hello");
}
}
执行此操作时,输出为String。虽然object
是超类,但为什么它显示string
而不是object
?
提前致谢
答案 0 :(得分:4)
本案中的规则是:
将采用更具体的签名
String
比Object
更具体,这就是使用print(String)
的原因。例如,尝试使用print(null)
中的main
,您会发现这些代码甚至无法编译,因为编译器无法区分null
是否为{{ 1}}或String
答案 1 :(得分:1)
因为当存在完全匹配时,在重载函数期间,JVM不会考虑泛化。即它将寻找与参数类型匹配的最佳拟合。在这种情况下,“Hello”与String类型完全匹配。由于String
在String
比在Object
更适合。因此它不会考虑
static void print(Object o)
答案 2 :(得分:1)
有string
打印,因为您传递的"Hello"
是String
对象。
String
也会扩展常规Object
,但重载调用也是最上层的类型。
答案 3 :(得分:1)
目前,此版本的重载方法执行:
static void print(String s){
System.out.println("string");
}
因为你这样打电话:
print("Hello");
仅当且仅当找不到正确的匹配版本时才会发生数据转换。并且找到了编译器的完全匹配。
答案 4 :(得分:1)
首先JVM
看到print(String)
,如果没有找到,它会搜索带有超类String参数的print()
。如果仍然没有找到,那么超级类String
的超类。并且该算法一直持续到print(Object)
。或报告错误