澄清方法重载

时间:2013-01-24 11:28:03

标签: java string overloading

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

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

提前致谢

5 个答案:

答案 0 :(得分:4)

本案中的规则是:

  

将采用更具体的签名

StringObject更具体,这就是使用print(String)的原因。例如,尝试使用print(null)中的main,您会发现这些代码甚至无法编译,因为编译器无法区分null是否为{{ 1}}或String

查看Oracle Overloading Tutorial

答案 1 :(得分:1)

因为当存在完全匹配时,在重载函数期间,JVM不会考虑泛化。即它将寻找与参数类型匹配的最佳拟合。在这种情况下,“Hello”与String类型完全匹配。由于StringString比在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)。或报告错误