理论
Java在调用同名函数时,如果实参满足多个同名函数的不同形参。那么最为精确的一个方法会被调用。例如test(Object object)和test(String string)都满足时。会选择更精确的一个方法。
何为更精确,如果有方法A,方法B,如果方法A的所有入参可以作为方法B的入参,同时方法B有的入参不能作为方法A的入参,那么就说A比B要精确(实用范围更小)
例子
这里有两个例子:
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);
}
}
运行结果如下:
Connected to the target VM, address: '127.0.0.1:58636', transport: 'socket'
double array
其实在ide中null前面已经显示是dArray,因为double[]也是引用类型,Object也是引用类型,能作为double[]参数的一定可以作为Object的参数。
另一个例子:
public class Eat {
public static void eatSomething(Object object){
System.out.println("eat object");
}
public static void eatSomething(Integer count){
System.out.println("eat Integer");
}
// public static void eatSomething(String count){
// System.out.println("eat String");
// }
}
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){
Eat.eatSomething(null);
}
}
结果是
Connected to the target VM, address: '127.0.0.1:58671', transport: 'socket'
eat Integer
如果把注释去掉,main方法所在的类无法编译通过,因为有两个精确度一样的方法,不知道选择哪一个。