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
参数的方法,因为 String
是 Object
.[=17 的子 class =]
另一方面,如果在具有不相关参数类型的方法之间进行选择 - 例如 method(String s)
和 method (Integer i)
- 代码将无法通过编译,因为 none其中一个选项优先于另一个选项。
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
参数的方法,因为 String
是 Object
.[=17 的子 class =]
另一方面,如果在具有不相关参数类型的方法之间进行选择 - 例如 method(String s)
和 method (Integer i)
- 代码将无法通过编译,因为 none其中一个选项优先于另一个选项。