2
public class Overloading {
    public static void main(String[] args) {
        Overloading o = new Overloading();
        o.display(null);
    }
    void display(String s) {
        System.out.println("String method called");
    }
    void display(Object obj) {
        System.out.println("Object method called");
    }
}

它以“调用字符串方法”的形式给出输出。我需要解释为什么?

4

2 回答 2

5

取自Java 规范

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。

首先:这两种方法都可以访问(显然)并且适用。它们都是适用的,因为null是 type nulltype,根据定义,它是所有类型的子类型。String比 更具体Object,因为String extends Object。如果您要添加以下内容,您将遇到问题,因为两者IntegerString都同样“具体”:

void display(Integer s) {
    System.out.println("Integer method called");
}
于 2013-10-29T15:28:51.413 回答
4

Java 总是会找到可用的最具体的方法版本。

Stringextends Object,因此它更具体。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

于 2013-10-29T15:28:58.943 回答