我有以下代码,我需要对重载概念进行一些澄清。
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");
}
}
当我执行这个时,输出是字符串。尽管object
是超类,但为什么它显示string
而不是object
?
提前致谢
在这种情况下的规则是:
将应用更具体的签名
String
比Object
更具体,这就是为什么使用print(String)
。例如,尝试在main
中使用print(null)
,您会发现这样的代码甚至无法编译,因为编译器将无法区分null
是String
还是Object
查看甲骨文重载教程
之所以称为string
打印,是因为您传递"Hello"
这是String
对象。
String
还扩展了常规Object
但重载调用也是最高级的类型。
目前,此版本的重载方法执行:
static void print(String s){
System.out.println("string");
}
既然你这样打电话: print("Hello");
且仅当找不到正确的匹配版本时,才会进行数据转换。并为编译器找到完全匹配。
第一个JVM
看到print(String)
,如果没有找到,它搜索带有字符串超类参数的print()
。如果仍然没有找到,那么超类的超类String
.并且该算法一直持续到print(Object)
.或报告错误
因为当存在完全匹配时,在重载函数期间,JVM 不会考虑泛化。 即它将寻找最适合的参数类型。在这种情况下,"Hello"与字符串类型完全匹配。由于String
更适合String
而不是Object
.因此,它不会考虑
static void print(Object o)