This question already has answers here:
Which overload will get selected for null in Java?
(3个答案)
5年前关闭。
我有这个令人困惑的代码:
当“编译”并运行程序时显示“double array”,为什么数组先于Object?还有其他构造器情况会发生这种令人困惑的行为吗?
(3个答案)
5年前关闭。
我有这个令人困惑的代码:
public class Confusing {
private Confusing(Object o){
System.out.println("Object");
}
private Confusing(double[]dArray){
System.out.println("double array");
}
public static void main(String[] args){
new Confusing(null);
}
}
当“编译”并运行程序时显示“double array”,为什么数组先于Object?还有其他构造器情况会发生这种令人困惑的行为吗?
最佳答案
double[]
也是Object
,并且在选择哪种构造函数(或方法)时,Java将选择具有最匹配的参数类型的构造函数。因为null
将匹配任何参数类型,所以最特定的类型匹配,因此这里是double[]
。
一旦知道了此规则,就不会感到困惑,但是当两个或多个重载的构造函数(或两个或多个重载的方法)的不同之处仅在于其中一个的参数类型是另一个的对应参数的子类时,就会发生这种情况。
JLS, Section 15.12.2.5声明当多个重载的方法/构造函数匹配时,Java如何选择要调用的方法/构造函数:
Java编程语言使用选择最具体方法的规则。
和
非正式的直觉是,如果第一种方法处理的任何调用都可以传递给另一个方法而没有编译时错误,则一个方法比另一个方法更具体。