精确性原则
关于以下程序的输出结果:
public class TestNull {
public void show(String a){
System.out.println("String");
}
public void show(Object o){
System.out.println("Object");
}
public static void main(String args[]){
TestMain t = new TestMain();
t.show(null);
}
}
输出结果为:
string
解释:主要是重载函数或构造函数调用时精确性的问题。
java是强类型语言,就是使用的时候要明确类型,如果不明确的话,编译器会帮你做,它会调用他认为最合适的那个,编译器也是程序,也是按照预先的规则执行。
Java的重载解析过程是以两阶段运行的。第一阶段 选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构 造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。
在我们的程序中,两个构造器都是可获得 并且可应用的。构造器Confusing(Object)可以接受任何传递给Confusing(double[ ])的参数,因此Confusing(Object)相对缺乏精确性。(每一个double数组都是一个Object,但是每一个Object并不一定是 一个double数组。)因此,最精确的构造器就是Confusing(double[ ]),这也就解释了为什么程序会产生这样的输出。
理解本谜题的关键在于在测试哪一个方法或构造器最精确。
要想用一个null参数来调用 Confusing(Object)构造器,你需要这样写代码:new Confusing((Object)null)。