“你好,阿米戈!幾天前我給你講過重載方法。你都明白了嗎?”
“是的。我記得。每個類方法都必須是唯一的。如果該類沒有其他具有相同名稱和參數類型的方法(並且參數的順序很重要),則成員方法是唯一的。”
“很好!我看你學得很好。今天我想擴展一下你在這方面的知識。你認為每種情況下會調用什麼方法?”
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代碼 | 描述 |
---|---|
|
在第一種情況下,int 將擴展為 Integer。因為 Integer 沒有方法,所以最合適的方法(也是調用的方法)是void print(Object o)
在第二種情況下,不會有任何編譯錯誤,並且會調用void print(String s),這有點不明顯。 |
“朋友,我希望你明白,在這種情況下,最好指定一個類型轉換運算符(就像我們對 «(byte)» 所做的那樣),以便準確知道將調用哪個方法。”
“我從沒想過重載方法會帶來任何問題。但後來你來了。謝謝,Rishi。我會在這一點上保持警惕。”