“你好,阿米戈!幾天前我給你講過重載方法。你都明白了嗎?”

“是的。我記得。每個類方法都必須是唯一的。如果該類沒有其他具有相同名稱和參數類型的方法(並且參數的順序很重要),則成員方法是唯一的。”

“很好!我看你學得很好。今天我想擴展一下你在這方面的知識。你認為每種情況下會調用什麼方法?”

代碼
class Cat
{
 public static void print(int n)
 {
  System.out.println(n);
 }
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }
public static void main(String[] args)
{
  Cat.print(1);
  Cat.print((byte)1);
  Cat.print("1");
  Cat.print(null);
 }
}

“這很難說。”

“在第一種情況下,1 是一個int。我們與採用 int 的方法 100% 匹配。將調用第一個void print(int n) 。

在第二種情況下,我們沒有採用字節的方法。但是有兩種方法採用 short 和 int。根據類型加寬規則,一個byte會先被加寬為short,然後再加寬為int。因此,判決是void print(short n)。將被調用。

在第三種情況下,我們與採用字符串的方法有 100% 的匹配。無效打印(String s)。方法將被調用。

第四種情況是模棱兩可的。null 沒有特定類型。編譯器將拒絕編譯這段代碼。在這種情況下,我們需要編寫Cat.print((Integer)null)來調用第三個方法,並編寫 Cat.print((String)null)來調用第四個方法。”

“這提供了很多信息。謝謝。”

“我想指出的是,在確定要調用的正確方法時,類型只能擴大。它們不能縮小。考慮這個例子:”

代碼
class Cat
{
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }

 public static void main(String[] args)
 {
  Cat.print((byte)1);
  Cat.print(1);
 }
}

在第一種情況下,字節類型將被擴展為 short,並調用第一個方法:void print(short n)。.

在第二種情況下,會有一個從int到Integer的隱式擴大轉換,然後會調用第二個方法:void print(Integer n)。.

“我沒想到。”

“不,這是真正的驚喜:”

Java代碼 描述
 class Cat
{
 public static void print(Object o)
 {
  System.out.println(o);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }

 public static void main(String[] args)
 {
  Cat.print(1);
  Cat.print(null);
 }
}
在第一種情況下,int 將擴展為 Integer。因為 Integer 沒有方法,所以最合適的方法(也是調用的方法)是void print(Object o)

在第二種情況下,不會有任何編譯錯誤,並且會調用void print(String s),這有點不明顯。

“朋友,我希望你明白,在這種情況下,最好指定一個類型轉換運算符(就像我們對 «(byte)» 所做的那樣),以便準確知道將調用哪個方法。”

“我從沒想過重載方法會帶來任何問題。但後來你來了。謝謝,Rishi。我會在這一點上保持警惕。”