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

时间:2015-02-12 09:29:24

标签: 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");
    }
}

修改

我又增加了一个方法:

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

现在编译器提供了错误The method method(Object) is ambiguous for the type Test

Integer a = null;

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

1 个答案:

答案 0 :(得分:11)

null可分配给任何引用类型。当涉及到方法重载时,编译器总是更喜欢具有更具体的参数类型的方法。因此,使用String参数的方法比使用Object参数的方法更受欢迎,因为StringObject的子类。

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