在java中的方法参数中传递空引用?

var*_*run 4 java string

当我运行此代码时,输​​出是"字符串"; 如果我隐藏接受String参数的方法并再次运行代码然后输出是"对象",那么有人可以解释一下这段代码是如何工作的吗?

public class Example {

    static void method(Object obj) {
        System.out.println("Object");
    }

    static void method(String str) {
        System.out.println("String");
    }  

    public static void main(String args[]) {
        method(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

Abi*_*san 8

编译器将选择最具体的方法,在这种情况下,String是Object的子类,因此将调用以String作为参数的方法.

来自JLS 15.12.2.5

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

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.