static void vaTest(int … v)
该语法告诉编译器调用的 vaTest( )的参数数目可以是零或更多,结果是 v 被隐式声明
为一个 int[]类型的数组。因此,在 vaTest( )内,是通过使用正常的数组句法来访问 v。下面
是使用变长参数改写的上一个程序:
class VarArgs {
static void vaTest(int … v) {
System.out.print("Number of args:" + v.length +"Contents:");
for(int x : v)
System.out.print(x + "");
System.out.println( );
}
public static void main(String args[ ]){
vaTest(10);
vaTest(1, 2, 3);
vaTest( );
}
}
该程序的输出与原版本的输出相同。
此程序有两个重要的地方需要注意。首先,在 vaTest( )内,v 是作为一个数组被操作
的,因为 v 本身就是一个数组。…语法只是告诉编译器将使用可变数目的参数,且这些参
数将存储到一个通过 v 引用的数组中。其次,在 main( )内,调用的时候 vaTest( )可带有不
同数目的参数,甚至可以不带参数。这些参数自动地被置入一个数组并传递给 v。在没有
参数的情况下,数组的长度是零。
一个方法既可以带“固定”参数,也可以带变长参数,但变长参数必须是该方法最后声
明的参数。例如,下面的方法声明是完全可以接受的:
int doIt(int a, int b,double c,int…vals){
在本例中,调用 doIt( )时使用的前三个实参与前三个形参相匹配。接下去,系统认定
剩余的实参属于 vals。
记住,varargs 参数必须处于最后。例如,下面的声明是错误的:
int doIt(int a,int b,double c,int…vals,boolean stopFlag) //错误!
因为这里在 varargs 参数后面声明一个常规参数。
还有一点限制必须注意:只能有一个 varargs 参数。例如,下面的声明是无效的:
int doIt(int a,int b,double c,int…vals,double…morevals) //错误!
试图声明第二个 varargs 参数是非法的。
下面是 vaTest( )的重写版本,它接受一个常规参数和一个变长参数:
class VarArgs2 {
static void vaTest(String msg, int … v) {
System.out.print(msg + v.length + "Contents:");
for(int x : v)
System.out.print(x +"");
System.out.println( );
}
public static void main(String args[ ]){
vaTest("One vararg:", 10);