2013-02-23 58 views
8

我在我的程序中遇到了一個問題,我用下面的一個小代碼片斷說明了問題。任何人都可以解釋爲什麼會發生?將null傳遞給喜歡使用字符串的方法,而不是對象

class ObjectnullTest { 

    public void printToOut(String string) { 

     System.out.println("I am null string"); 
    } 


    public void printToOut(Object object) 

     System.out.println("I am null object"); 
    } 



class Test { 

    public static void main(String args[]) { 

     ObjectnullTest a = new ObjectnullTest(); 
     a.printToOut(null); 

    } 
} 

這總是打印I am null string

我想知道原因,以便我可以修改代碼。

在此先感謝。

+1

[對NULL參數方法重載]的可能重複(http://stackoverflow.com/questions/5229809/method-overloading-for-null-parameter) – jlordo 2013-02-23 23:05:45

+0

許多choosen其他人,請參閱[http://stackoverflow.com/search?q=%5Bjava%5D+overloading+null](http://stackoverfl ow.com/search?q=%5Bjava%5D+overloading+null) – jlordo 2013-02-23 23:08:04

+0

對不起,相同的標準問題,無法找到適當的關鍵詞。 – 2013-02-23 23:11:46

回答

11

這是因爲方法的重載情況下

最具體方法是在編譯時choosen。

由於'java.lang.String'是一個比'java.lang.Object'更具體的。在你的情況下,選擇'String'作爲參數的方法。

其明確記載在JLS

第二步搜索在 構件的方法的一步驟中確定的類型。此步驟使用方法的名稱以及參數表達式的類型來查找既可訪問 且適用的方法,即可在給定參數上正確調用 的聲明。

可能有不止一種這樣的方法,在 哪種情況下選擇最具體的方法。最具體方法的描述符(簽名 加上返回類型)是在運行時使用的一個方法 來執行方法調度。

5

我同意關於選擇最具體方法的現有評論。你可以強迫你的空被視爲一個對象引用,避免使用字符串參數的方法,通過鑄造它:

a.printToOut((Object)null); 
2

請參閱JLS,在細節給第15.12.2.5如何選擇

最具體方法是在編譯時

相關問題