From Gossip@Openhome

Java Gossip: 重載(Overload)方法

Java支援方法「重載」(Overload),又有人譯作「超載」、「過載」,這種機制為類似功能的方法提供了 統一的名稱,但是根據參數列型態的不同,而自動呼叫對應的方法。

一個例子可以從 java.lang.String 類別上提供的所有方法看到,像是它的valueOf()方法就提供了多個版本:
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(char[] data)
static String valueOf(char[] data, int offset, int count)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(Object obj)

雖然呼叫的方法名稱都是valueOf(),但是根據所傳遞的引數資料型態不同,您可以呼叫不同版本的方法來進行對應的動作。

方法重載的功能使得程式設計人員能較少苦惱於方法名稱的設計,以統一的名稱來呼叫相同功能的方法,方法重載不僅可根據傳遞引數的資料型態不同來呼叫對應的 方法,參數列的參數個數也可以用來設計方法重載。

方法重載時可以根據方法參數列的資料型態,也可以根據參數的個數,不過必須注意的是,方法重載不可根據傳回值的不同來區別。

方法重載當被使用於物件導向設計時的建構方法的使用時,提供物件生成時不同的建構方法,或者是使用於物件所提供的同名方法,但多樣化的參數設定方式。

J2SE 5.0 後,當您使用方法重載時,要注意到 autoboxing、 unboxing 的問題,來看看下面的程式片段,您認為結果要是什麼?

  • Test.java
public class Test {
public static void main(String[] args) {
someMethod(1);
}

public static void someMethod(int i) {
System.out.println("i");
}

public static void someMethod(Integer integer) {
System.out.println("integer");
}
}

結果必須是顯示 "i",您不能期待裝箱(boxing)的動作會發生,如果您想要呼叫引數列為Integer版本的方法,您要明確指定:
someMethod(new Integer(1));

編譯器在處理重載與裝箱問題時,會依以下的順序:
  1. 找尋在還沒有裝箱動作前可以符合的方法
  2. 第一步失敗的話,嘗試裝箱動作後可以符合的方法
  3. 第二步也失敗,嘗試有裝箱及有 不 定長度引數 的方法
  4. 第三步也失敗,編譯器找不到合適的方法,回報編譯錯誤