null是引用类型,是String引用还是Object引用?

Null is of reference type, is it a String reference or Object reference?

null 是一个引用,它只是 null 类型,即 null 不是对象类型。 但是,当我 运行 以下代码片段时,当我将 null 传递给方法 method(null); 时,我很惊讶它调用 method(String s) 而不是 method(Object o).

如果null本身是Java定义的类型而不是对象类型,那么为什么它调用method(String s)而不是method(Object o)

public class Test {
    public static void main(String[] args) {
        method(null);
    }
    public static void method(Object o) {
        System.out.println("Object impl");
    }
    public static void method(String s) {
        System.out.println("String impl");
    }
}

编辑

我又添加了一种方法:

public static void method(Integer s) {
   System.out.println("String impl11");
}

现在编译器给出错误 The method method(Object) is ambiguous for the type Test

Integer a = null;

如果它是合法的,那为什么我会看到编译时异常?

null 可分配给任何引用类型。当谈到方法重载时,编译器总是更喜欢具有更具体参数类型的方法。因此,带有 String 参数的方法优于带有 Object 参数的方法,因为 StringObject.[=17 的子 class =]

另一方面,如果在具有不相关参数类型的方法之间进行选择 - 例如 method(String s)method (Integer i) - 代码将无法通过编译,因为 none其中一个选项优先于另一个选项。