public class test {
public static void main(String[] args) throws Exception {
Temp temp = new Temp();
temp.test("1");
temp.test(null);
}
}
public class Temp {
public void test(Object a){
System.out.println("test Object");
}
public void test(String a){
System.out.println("test string");
}
}
為什麼輸出結果為
test Object
test Object
輸出結果是
test string
test string
null就是代表空對象,在內存中沒有占用空間,只占了一個引用空間。
只針對你寫的測試例子來將,你的例子更應該是一個overload重載的測試用例。
簡單說下重載:jdk重載編譯期間就決定了代碼的走向,而編譯時判斷依據就是根據方法中參數類型,以及方法調用者傳入的參數,將前者最大程度(Class繼承結構)匹配後者的方法,作為編譯結果。運行時也將使用次方法。
回到你的問題上,null既然是空對象,那麼既可以作為Object (如Object o = null;編譯通過),也可以作為String (如String s = null;編譯通過)。java.lang.String也是繼承的Object類。所以最大程度匹配後,編譯器決定執行public void test(String a)方法。
綜上,代碼test(null)的運行結果為:test string
對重載想要有更深的理解,推薦你查看http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.12.2.10