1. 程式人生 > >Java可變引數(...)方法過載時要注意的幾個問題

Java可變引數(...)方法過載時要注意的幾個問題

JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的帶任意多個引數的方法。Java的可變引數,可用於普通方法上,也可以用於構造方法上,大大增大了我們所寫方法的適用範圍。


然而,使用可變引數時,要注意幾個問題:

1) 可變引數方法與陣列引數方法過載時

public class MethodParams{
//帶可變引數的方法
public void hello(String ...params) {
System.out.println("執行帶可變引數的方法,引數個數為:" + params.length);
}
//帶陣列引數的方法
public void hello(String[] params) {
System.out.println("執行帶陣列引數的方法,陣列長度為:" + params.length);
}
}

我們寫個測試程式碼執行一下看看結果如何:

	MethodParams mp = new MethodParams();
mp.hello("AAA","BBB","CCC");

  編譯時報錯:

MethodParams.java:7: 無法在 MethodParams 中同時宣告 hello(java.lang.String[]) 和
hello(java.lang.String...)
public void hello(String[] params) {
^
1 錯誤

結論: JDK不允許存在, 帶可變引數的方法和帶陣列引數的方法在同一類中過載。

可變引數==陣列引數? 在帶可變引數的方法體時,讀取可變引數列表時,就是以陣列的方式來讀取;

帶可變引數的方法可以傳入一個數組引數,但帶陣列引數的方法卻不能傳入可變引數。

2) 可變引數方法與可變引數方法過載時

	//帶可變引數的方法
public void hello(String ...params) {
System.out.println("執行帶可變引數的方法,引數個數為:" + params.length);
}
//帶固定引數和可變引數
public void hello(String param1, String ...params) {
System.out.println("執行帶固定引數和可變引數的方法,引數個數為:" + params.length);
}

  測試程式碼跟上例中一樣,編譯時報錯:

MethodParams.java:18: 對 hello 的引用不明確,MethodParams 中的 方法 hello(java.l
ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String
...) 都匹配
mp.hello("AAA","BBB","CCC");
^
1 錯誤

 結論:JDK不允許存在,帶相同引數型別列表(Type List)的引數列表的方法在同一類中過載。

3)可變引數方法與無引數方法過載時

	//帶可變引數的方法
public void hello(String ...params) {
System.out.println("執行帶可變引數的方法,引數個數為:" + params.length);
}
//不帶引數的方法
public void hello() {
System.out.println("執行不帶引數的方法");
}

我們都知道,可變引數即可帶0個或者多個引數,如果帶0個引數即不帶引數時,JDK會怎麼處理呢?

那我們就以執行"mp.hello()"來測試一下。編譯通過,執行正常,呼叫的還帶引數的hello()方法。

結論:當可變引數方法與不帶引數的方法過載時,JDK預設呼叫的是無引數的方法。若類中沒有定義無引數的方法,則會呼叫可變引數的方法。