有空參數的重載方法選擇
考慮以下Java 程式碼:
public 類別MoneyCalc {<p>public void 方法(Object o) {</p><pre class="brush:php;toolbar:false"> System.out.println("Object Verion");
登入後複製
}
public void 方法(String s) {
System.out.println("String Version");
登入後複製
登入後複製
}
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
登入後複製
登入後複製
}
}
這裡是重載當方法當方法傳遞空值作為參數時選擇的是“method(String s)”方法。這可能看起來違反直覺,因為 null 沒有明確聲明為字串變數。
將 Null 理解為物件
儘管名稱為“物件版本”,但“method(Object o)”重載不限於物件。在Java中,null可以轉換為任何類別類型的表達式,包括String。因此,以下賦值是有效的:
確定方法特異性
Java 編譯器根據Java 語言規格(JLS) 第15.12.2.5 節選擇最具體的重載。通俗地說,如果一個方法處理的呼叫也可以由另一個方法處理而不會出現編譯時類型錯誤,則該方法更具體。
在這種情況下,「method(String s)」重載更具體,因為它可以處理帶有字串參數的呼叫。另一方面,「method(Object o)」重載可以處理任何物件類型,包括 null。但是,它無法在不進行強制轉換的情況下處理帶有 String 參數的調用,這將導致編譯時發生錯誤。
StringBuffer 和String 的模糊重載
如果我們修改程式碼以包含額外的「method(StringBuffer sb)」重載,我們遇到了不明確的重載錯誤:
public class MoneyCalc {<p></p>public void method(StringBuffer sb) {<pre class="brush:php;toolbar:false"> System.out.println("StringBuffer Verion");
登入後複製
}
public void 方法(String s) {
System.out.println("String Version");
登入後複製
登入後複製
}
public static void main(String args[] ) {
MoneyCalc question = new MoneyCalc();
question.method(null);
登入後複製
登入後複製
}
}
}}}}}}}這是因為「method(StringBuffer sb)」和「method(String s)」都不是「 過載比另一個更具體。它們都可以處理空參數,而且都不能在不進行強制轉換的情況下處理對方的參數型別。
以上是為什麼Java的重載方法選擇在傳遞'null”時選擇'method(String s)”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!