Null是引用类型,它是String引用还是Object引用?

Pri*_*iya 7 java oop object

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

我添加了一个方法:

public static void method(Integer s) {
   System.out.println("String impl11");
}
Run Code Online (Sandbox Code Playgroud)

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

Integer a = null;
Run Code Online (Sandbox Code Playgroud)

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

Era*_*ran 11

null可分配给任何引用类型.当涉及到方法重载时,编译器总是更喜欢具有更具体的参数类型的方法.因此,带String参数的方法优于带Object参数的方法,因为它String是一个子类Object.

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