关于方法重载的说明



我有以下代码,我需要对重载概念进行一些澄清。

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

提前致谢

在这种情况下的规则是:

将应用更具体的签名

StringObject更具体,这就是为什么使用print(String)。例如,尝试在main中使用print(null),您会发现这样的代码甚至无法编译,因为编译器将无法区分nullString还是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)

最新更新