方法重載和空參數選擇
Java中,當一個方法重載時,會存在多個同名但參數列表不同的方法。當進行方法呼叫時,編譯器會根據傳遞的實際參數的數量和類型來決定要呼叫哪個重載方法。
考慮以下程式碼片段:
public class MoneyCalc { public void method(Object o) { System.out.println("Object Verion"); } public void method(String s) { System.out.println("String Version"); } public static void main(String args[]) { MoneyCalc question = new MoneyCalc(); question.method(null); } }
問題:為什麼向重載方法方法傳遞null值會呼叫method(String)版本?
答案:
在Java中,null是一個特殊的常數值,表示對不存在的物件的引用。它不是任何特定類型的值,但可以指派給任何引用類型的變量,包括 Object 和 String。
當使用 null 作為參數進行方法呼叫時,編譯器會選擇method(String) 版本,因為它比 method(Object) 版本更具體。根據 Java 語言規範 (JLS),最具體的重載是根據其適用性和特異性來選擇的。
適用性是指參數是否可以傳遞給方法而不會出現編譯時錯誤。在這種情況下,null 適用於這兩種方法,因為它可以指派給 Object 和 String 類型的變數。
特異性衡量方法對於給定參數的專用程度。在這種情況下,method(String) 重載更加具體,因為它被設計為僅處理 String 類型的參數。 method(Object) 重載較為通用,因為它可以處理 Object 類型或其任何子類別的參數。
因此,編譯器選擇method(String) 版本,因為它更具體且適用於所提供的
注意: 如果在MoneyCalc 類別中加入第二個以StringBuffer 為參數類型的重載方法,則會出現編譯錯誤。這是因為在這種情況下,方法(String)和方法(StringBuffer)都不會比另一個更具體,從而導致方法選擇上的歧義。
以上是為什麼在 Java 中將 null 傳遞給重載方法會呼叫帶有 String 參數的方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!