2017-06-24 94 views
0
class Jaguar 
{ 
void method(Object o) 
{ 
    System.out.println("Object Called"); 
} 
void method(String s) 
{ 
    System.out.println("String Called"); 
} 
public static void main(String[] args) 
{ 
    Jaguar j=new Jaguar(); 
    j.method(null); 
} 
} 

問題:代碼的o/p是被調用的字符串,而不是ObjectCalled ..爲什麼?空值適用對象也..爲什麼使用字符串參數的方法被調用,而不是使用Object參數的方法

+0

對象是可用的最高級別。但是如果一個子類可用,它將被調用。而且,一切首先轉換爲String(如果可用),而不是Object。你大多需要投射到對象。 – user388229

回答

1

Java將始終嘗試使用這可看的方法的最具體的適用版本:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

對象和字符串都可以採取null作爲有效值。因此,所有3版是適用的,所以Java將不得不尋找最特殊的一個。

由於對象是字符串的超類型,String版本比對象的版本更具體。所以如果只有這兩種方法存在,String版本將被選中。

每對這三種方法時用空參數調用是由本身不明確的。因爲每個參數類型都是參考類型。

以下是三種方式來調用與空你的一個具體方法。

doSomething((Object) null); 
doSomething((String) null); 

如果添加與對象的子類例如整數多了一個方法,則編譯器將拋出曖昧方法錯誤在這種情況下,編譯器不能決定是否該方法可稱爲串一個或整數之一。

我希望這有助於。

相關問題