大可制作:QQ群:31564239(asp|jsp|php|mysql)

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() 中作对应的处理。