public String testFun(String s) { System.out.println("String String"); return ""; } public void testFun(Object o) { System.out.println("object void"); } T.testFun("123");會調用第一個方法 問題:“123”也是Object類型的啊,爲什麼不會調用下面的方法?回答:
因爲Object是所有類的父類,所以這裏如果你傳入字符串的話,相當於覆蓋了父類中的方法,只會調用 子類的方法,如果你傳入一個整型的話,那麼在子類中就找不到這個方法 ,就會在父類中去找,就會調用第二個方法。
另一個,預先不確定的實參類型引起的錯誤。
先考慮下面代碼的輸出:
- public class JavaPuzzles {
- public static void main(String[] args) {
- JavaPuzzles.printObj(null);
- }
- public static void printObj(double[] array){
- System.out.print("double array");
- }
- public static void printObj(Object obj){
- System.out.println("Object");
- }
- }
輸出結果:double array ,我們來分析一下。 JAVA函數重載調用一般分爲兩個步驟:
1、找到所有可用的方法或構造器。 從上面的示例中,我們找到兩個,參數類型分別爲:double[] 和 Object
2、從1中根據參數類型選擇最精確的方法或構造器進行調用。對於null我們事先並不能確定其類型,兩個函數都滿足條件,數組也是繼承自Object所以,double[]比Object具有更高的精確度,於是輸出結果就爲double array。
進一步考慮:- public class JavaPuzzles {
- public static void main(String[] args) {
- JavaPuzzles.printObj(null); // 這裏會出現編譯錯誤
- }
- public static void printObj(double[] array){
- System.out.print("double array");
- }
- public static void printObj(Number number){
- System.out.print("number");
- }
- public static void printObj(Object obj){
- System.out.println("Object");
- }
- }
如果調用重載函數的話,是可以通過編譯的。如果調用了會編譯通不過,提示:
The method printObj(double[]) is ambiguous for the type JavaPuzzles。
爲什麼?因爲編譯的時候,我們不能夠確定null到底是什麼類型,Number和doubl[]都繼承自Object,根本無法區分,於是就出現了編譯錯誤。
於是我們可知,在這種事先不能夠明確類型的參數重載調用,只能夠發生在父子或多層繼承關係中,但不能發生在兄弟或者兄弟子孫間。
例如,因爲String繼承自Object,而Double繼承自Object-->Number,所以顯示調用null的時候編譯會提示錯誤。
- public static void printObj(Double dbl){
- System.out.print("double");
- }
- public static void printObj(String string){
- System.out.println("string");
- }
- public static void printObj(Double dbl){
- System.out.print("double");
- }
- public static void printObj(Number number){
- System.out.println("number");
- }
- JavaPuzzles.printObj((Number)null);