2013-01-24 102 views
0

我有以下代碼,我需要一些關於超載概念的說明。關於方法超載的澄清

class Overload{ 
    static void print(Object o){ 
     System.out.println("object"); 
    } 
    static void print(String s){ 
     System.out.println("string"); 
    } 
    public static void main(String...args){ 
     print("Hello"); 
    } 
} 

當我執行此操作時,輸出是String。事實上,object是超級班,它爲什麼顯示string而不是object

在此先感謝

+0

https://blogs.oracle.com/mcimadamore/entry/testing_overload_resolution – Habib

回答

4

在這種情況下,規則是:

更具體的簽名將適用

StringObject更具體的,這就是爲什麼使用print(String)。例如,嘗試用print(null)main,你會看到找出這樣的代碼甚至不會編譯,因爲編譯器將沒有辦法區分null是否是StringObject

退房Oracle Overloading Tutorial

1

因爲當存在完全匹配時,在重載函數期間,JVM將不考慮泛化。即它會尋找最適合匹配參數類型。在這種情況下,「Hello」與String類型完全匹配。由於String適合StringObject更好。因此,它不會考慮

static void print(Object o) 
1

有被稱爲string打印,因爲你通過"Hello"這是String對象。

String也延伸定期Object但重載調用也是最高類型。

1

目前,這個版本的重載方法的執行:

static void print(String s){ 
    System.out.println("string"); 
} 

既然你在呼喚這樣的:只有當且僅當匹配的正確版本沒有找到 print("Hello");

的數據轉換髮生。編譯器找到完全匹配。

1

第一個JVM代表print(String),如果沒有找到,則搜索帶有超類String參數的print()。如果仍然沒有找到,那麼超級的超類String。這個算法一直持續到print(Object)。或報告錯誤