0

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

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

提前致谢

4

5 回答 5

4

这种情况下的规则是:

更具体的签名将适用

String比 更具体Object,这print(String)就是使用的原因。例如,在你的 中尝试使用print(null)main你会发现这样的代码甚至无法编译,因为编译器无法区分null是 aString还是 anObject

查看Oracle 重载教程

于 2013-01-24T11:31:34.173 回答
1

因为当有完全匹配时,在函数重载时,JVM不会考虑泛化。即它将寻找最适合匹配参数类型的方法。在这种情况下,“Hello”与 String 类型完全匹配。因为in比 inString更适合。因此不会考虑StringObject

static void print(Object o)
于 2013-01-24T11:30:16.503 回答
1

之所以称为string打印,是因为您传递"Hello"的是String对象。

String还扩展了常规Object但重载的调用也是最高级的类型。

于 2013-01-24T11:30:21.977 回答
1

目前,这个版本的重载方法执行:

static void print(String s){
    System.out.println("string");
}

既然你这样打电话: print("Hello");

只有当且仅当没有找到正确的匹配版本时,才会发生数据转换。并为编译器找到完全匹配。

于 2013-01-24T11:30:33.227 回答
1

首先JVM查看,如果未找到,则使用 String 超类的参数进行print(String)搜索。print()如果还没有找到,那么超类的超类String。并且这个算法一直持续到有print(Object)。或者报错

于 2013-01-24T11:35:17.580 回答