2013-05-18 30 views
4

我無法理解,爲什麼這個程序打印字符串方法overrding傳遞null對象

class AA { 

    void m1(Object o) { 
     System.out.println("Object "); 
    } 

    void m1(String o) { 
     System.out.println("String "); 
    } 
} 

public class StringOrObject { 

    public static void main(String[] args) { 
     AA a = new AA(); 
     a.m1(null); 
    } 
} 

請幫助我理解它是如何工作的打印斯汀,而不是對象

+6

因爲它會嘗試調用最具體的方法,在這種情況下是String。 –

+1

我確定這有一個重複,但我找不到它。 – dasblinkenlight

+0

我想知道如果像「void m1(Integer o)」這樣的方法會被聲明爲除了這兩個方法之外會有什麼結果呢?編譯時錯誤? –

回答

0

這將試圖使最具體的電話。在這種情況下,Subclass對象獲得了String的首選項。

3

戴夫牛頓的評論是正確的。對該方法的調用將轉到最具體的可能實現。另一個例子是:

class Foo {} 
class Bar extends Foo {} 
class Biz extends Bar {} 


public class Main { 

    private static void meth(Foo f) { 
     System.out.println("Foo"); 
    } 

    private static void meth(Bar b) { 
     System.out.println("Bar"); 
    } 

    private static void meth(Biz b) { 
     System.out.println("Biz"); 
    } 


    public static void main(String[] args) { 
     meth(null); // Biz will be printed 
    } 
} 
+0

+1,用於使用'meth'函數 –