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

vin*_*mar 2 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

noo*_*one 5

取自Java规范:

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

首先:两种方法都是可访问的(显然)且适用.它们都是适用的,因为null它是类型的nulltype,根据定义它是所有类型的子类型.String比具体更具体Object,因为String extends Object.如果你想补充以下内容,你将有一个问题,因为这两个IntegerString同样"具体":

void display(Integer s) {
    System.out.println("Integer method called");
}
Run Code Online (Sandbox Code Playgroud)