以下Java程序的输出是什么,其中null作为重载方法的参数传递?

时间:2013-10-29 15:20:39

标签: java overloading

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");
    }
}

它将输出作为“String方法调用”。我需要解释原因吗?

2 个答案:

答案 0 :(得分:5)

取自Java Spec

  

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

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

void display(Integer s) {
    System.out.println("Integer method called");
}

答案 1 :(得分:4)

Java总能找到最具体的方法版本。

String扩展Object,因此更具体。

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