在 J2SE 5.0 中开始支持不定长度自变量(Variable-Length Argument),直接来看个例子:
public class MathTool { public static int sum(int... nums) { int sum = 0; for(int num : nums) { sum += num; } return sum; } }
要使用不定长度自变量,在宣告自变量时,于关键词后加上...,然后您可以这么使用它:
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() 中作对应的处理。