ITEEDU

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