From Gossip@Openhome

Java Gossip: 不定長度引數

J2SE 5.0 中開始支援不定長度引數(Variable-Length Argument),直接來看個例子:
  • MathTool.java
public class MathTool {
public static int sum(int... nums) {
int sum = 0;
for(int num : nums) {
sum += num;
}
return sum;
}
}

要使用不定長度引數,在宣告引數時,於關鍵字後加上...,然後您可以這麼使用它:
  • TestVarargs.java
public class TestVarargs {
public static void main(String[] args) {
int sum = 0;

sum = MathTool.sum(1, 2);
System.out.println(sum);

sum = MathTool.sum(1, 2, 3);
System.out.println(sum);

sum = MathTool.sum(1, 2, 3, 4, 5);
System.out.println(sum);
}
}

執行結果會分別顯示3、6、15。

顯然的,從MathTool類別的sum()中您可以看到,實際上編譯器會將int... nums解譯為int[] nums,而設定給方法的引數則會被化為int陣列傳入至sum()中,您只要將nums當作陣列來處理就是了。

在方法上設定不定長度引數時,記得必須設定在引數列的最後一個,例如下面的方式是合法的:
public void someMethod(int arg1, int arg2, int... varargs) {
     // ....
}
 

但下面的方式是不合法的:
public void someMethod(int... varargs, int arg1, int arg2) {
     // ....
}
 
您也沒辦法設定兩個以上的不定長度引數,例如下面的方式是不合法的:
public void someMethod(int... varargs1, int... varargs2) {
     // ....
}
 

如果要物件的不定長度引數,其方法相同,例如:
public void someMethod(SomeClass... somes) {
     // ....
}
 

回憶一下 給C使用者的第一個Java程式 中您介紹的printf(),在其中您可以設定多個引數,其實背後也是不定長度引數的原理,例如:
System.out.printf("My name is %s and your name is %s.",
      "caterpillar", "momor");

編譯器會幫您解譯printf()的 ',' 之後的引數為陣列,再傳入 printf() 中作對應的處理。