我有这个令人困惑的代码:
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之前?是否有其他构造函数情况会发生这种令人困惑的行为?
答案 0 :(得分:4)
double[]
也是Object
,当选择哪个构造函数(或方法)时,Java将选择具有最匹配的最具体参数类型的构造函数。由于null
将匹配任何参数类型,因此最具体的类型匹配,此处为double[]
。
一旦你知道这个规则就不会混淆,但是当两个或多个重载的构造函数(或两个或多个重载方法)的区别仅在于其中一个参数类型中的一个参数类型是相应参数的子类时,就会发生这种情况。在另一个。
JLS, Section 15.12.2.5说明当多个重载方法/构造函数匹配时,Java如何选择方法/构造函数来调用:
Java编程语言使用选择最具体方法的规则。
和
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。
答案 1 :(得分:2)
阅读Java语言规范中的更多内容,以选择最具体的方法规则。