java函數重載簡單問題體現繼承問題

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是所有類的父類,所以這裏如果你傳入字符串的話,相當於覆蓋了父類中的方法,只會調用 子類的方法,如果你傳入一個整型的話,那麼在子類中就找不到這個方法
,就會在父類中去找,就會調用第二個方法。



另一個,預先不確定的實參類型引起的錯誤。

先考慮下面代碼的輸出:

  1. public class JavaPuzzles {  
  2.     public static void main(String[] args) {  
  3.         JavaPuzzles.printObj(null);  
  4.     }  
  5.       
  6.     public static void printObj(double[] array){  
  7.         System.out.print("double array");  
  8.     }  
  9.       
  10.     public static void printObj(Object obj){  
  11.         System.out.println("Object");  
  12.     }  
  13. }  

    輸出結果:double array ,我們來分析一下。 JAVA函數重載調用一般分爲兩個步驟:

    1、找到所有可用的方法或構造器。 從上面的示例中,我們找到兩個,參數類型分別爲:double[] 和 Object

    2、從1中根據參數類型選擇最精確的方法或構造器進行調用。對於null我們事先並不能確定其類型,兩個函數都滿足條件,數組也是繼承自Object所以,double[]比Object具有更高的精確度,於是輸出結果就爲double array。

   進一步考慮:
  1. public class JavaPuzzles {  
  2.     public static void main(String[] args) {  
  3.         JavaPuzzles.printObj(null); // 這裏會出現編譯錯誤  
  4.     }  
  5.       
  6.     public static void printObj(double[] array){  
  7.         System.out.print("double array");  
  8.     }  
  9.       
  10.     public static void printObj(Number number){  
  11.         System.out.print("number");  
  12.     }  
  13.       
  14.     public static void printObj(Object obj){  
  15.         System.out.println("Object");  
  16.     }  
  17. }  

如果調用重載函數的話,是可以通過編譯的。如果調用了會編譯通不過,提示:

The method printObj(double[]) is ambiguous for the type JavaPuzzles。

爲什麼?因爲編譯的時候,我們不能夠確定null到底是什麼類型,Number和doubl[]都繼承自Object,根本無法區分,於是就出現了編譯錯誤。

於是我們可知,在這種事先不能夠明確類型的參數重載調用,只能夠發生在父子或多層繼承關係中,但不能發生在兄弟或者兄弟子孫間。

例如,因爲String繼承自Object,而Double繼承自Object-->Number,所以顯示調用null的時候編譯會提示錯誤。

  1. public static void printObj(Double dbl){  
  2.     System.out.print("double");  
  3. }  
  4.   
  5. public static void printObj(String string){  
  6.     System.out.println("string");  
  7.         }  
而因爲Double繼承自Number,所以調用null的時候,會調用更高精度的函數,即輸入double
  1. public static void printObj(Double dbl){  
  2.     System.out.print("double");  
  3. }  
  4.   
  5. public static void printObj(Number number){  
  6.     System.out.println("number");  
  7. }  
解函數重載給我們帶來了很多的方便,但是有的時候不注意,可能會帶來不期望的結果,如果避免此類的問題,可以在調用的時候明確調用參數的精確類型,從而避免問題出現。如
  1. JavaPuzzles.printObj((Number)null); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章