package someTest;
class SSSuperClass{}
class SSSubClass extends SSSuperClass{}
public class TestDuplicate {
public void function(Object o){ //方法1
System.out.print("Object\n");
}
public void function(int[] array){ //方法2
System.out.print("int[] array\n");
}
public void function(SSSuperClass array){ //方法3
System.out.print("SSSuperClass\n");
}
public void function(SSSubClass array){ //方法4
System.out.print("SSSubClass\n");
}
/**
* @param args
*/
public static void main(String[] args) {
new TestDuplicate().function(new Object()); //呼叫1
new TestDuplicate().function(new int[3]); //呼叫2
new TestDuplicate().function(new SSSubClass()); //呼叫3
new TestDuplicate().function(new SSSuperClass()); //呼叫4
/**
* 一切都看似很和諧。引數過載可以允許父類和子類關係的存在,
* 呼叫的時候會根據實際的引數,尋找最為精確匹配的那個函式去執行。
* 如果我們去掉方法4,呼叫4就會發現方法3才是它最匹配的函式,所以呼叫之。
* 如果去掉方法3,呼叫4會發現方法1才是自己的實參最匹配的函式,所以呼叫之。
* */
/**
* 但是如果我們傳入的不是陣列,也不是任何物件,而是一個null呢???
* 同樣null也會找一個最為精確匹配的函式,但是這裡會編譯錯誤。因為這邊有兩條繼承
* 路徑,一個是Object->array[],一個是Object->SSSuperClass->SSSubClass。
* 所以方法2和方法4,null就不知道哪個才是最精確的匹配了。
* 所以我們方法3和方法4在下面的呼叫下不相容,有歧義。
* */
//new TestDuplicate().function(null); //compile error
//可以看到null雖然是物件,但是卻什麼都不是,甚至連Object都不是,但是他依然會尋找最為匹配的形參
String s = null;
String ss = "sss";
if(s instanceof String) System.out.print("s is String");
if(ss instanceof String) System.out.print("ss is String");
if(null instanceof Object) System.out.print("null is a Object");
}
}