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

7
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。该错误与Test类型的method方法存在二义性有关。
Integer a = null;

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

请参见https://dev59.com/_l4b5IYBdhLWcg3w-10I - Thomas Stets
@ThomasStets 我认为这不是重复的问题。 - Priya
@Priya 是的。请阅读问题,它要求完全相同的事情,只是方法参数具有不同的类型。 - BackSlash
基本上是同一个问题:重载方法,使用空参数调用时,为什么会调用这个而不是那个。答案也是一样的。 - Thomas Stets
1个回答

11

null 可以赋值给任何引用类型。在方法重载中,编译器总是更喜欢具有更具体的参数类型的方法。因此,具有 String 参数的方法优先于具有 Object 参数的方法,因为 StringObject 的子类。

另一方面,如果选择的是具有不相关的参数类型的方法-例如 method(String s)method(Integer i) - 代码将无法通过编译,因为两个选项都没有优先权。


我已经编辑了我的问题。 - Priya
@ Priya 我已经编辑了答案以回应你的修改。 - Eran
意思是StringInteger等都是Object类的子类,导致编译器无法确定要调用哪个方法,对吗? - Priya
@Priya,String不是Integer的子类,Integer也不是String的子类。因此,编译器对这两者没有偏好。 - Eran
感谢您回答我的问题。 - Priya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接