我有这个令人困惑的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
当"编译"并运行程序显示"双数组"为什么数组先于Object?是否有其他构造函数情况会发生这种令人困惑的行为?
Adouble[]也是一个Object,当选择哪个构造函数(或方法)时,Java 会选择参数类型最具体且仍然匹配的那个。因为null会匹配任何参数类型,最具体的类型匹配,那就是double[]这里。
一旦您了解了这条规则,就不会感到困惑,但是当两个或多个重载构造函数(或两个或多个重载方法)仅在其中一个参数类型是另一个中相应参数的子类时,就会发生这种情况。
JLS第 15.12.2.5 节说明了当多个重载方法/构造函数匹配时,Java 如何选择要调用的方法/构造函数:
Java 编程语言使用选择最具体方法的规则。
和
非正式的直觉是,如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时错误,则一个方法比另一个方法更具体。