2011-03-27 18 views
3
public class Main { 
    public void testMethod(Object o){ 
     System.out.println("Object Method called"); 
    } 
    public void testMethod(String s){ 
     System.out.println("String Method called"); 
    } 

    public static void main(String[] args) { 
     new Main().testMethod(null); 
    } 
} 

這個程序調用神奇的字符串的方法? Java編譯器決定使用String方法的標準是什麼?有人可以指出我的原因嗎?如何與Java有不同的參數類型的同名方法之間做出選擇?

回答

12

的規則是編譯器選擇「最具體的」過載了所有比賽。由於字符串是對象的一個​​子類,這使得String版本「更具體」,因此它選擇

+0

而且,如果你想使用對象方法,就可以把參數的對象 - '新的Main()TestMethod的((對象)NULL);' – 2011-03-27 02:10:17

2

Java語言規範的執行部分是JLS 15.12.2.5

「如果不止一個成員方法既方便和適用於方法調用,就必須選擇一個提供運行時方法調度描述符。Java的親編纂語言使用選擇最具體方法的規則。

非正式直覺是一種方法比另一種更具體的,如果通過第一種方法處理的任何調用可以被傳遞到另一個沒有編譯時類型錯誤「。

該JLS然後繼續給出瞭如何確定最具體的方法的詳細技術規範

相關問題