在java SE5.0之后提供了可以用可变的参数数量调用的方法(有时称为“变参”方法)
我们用最常见的printf方法举例,列如:
System.out.printf("%d", n);
System.out.printf("%d %s", n,"widgets");
在上面的两条语句中,尽管一个调用包含两个参数,另一个调用包含三个参数,但他们调用的是同一个方法。
printf是这样定义的:
public class PrintStream{
public PrintStream printf(String fmt,Object...args) {return format(fmt,args);}
}
这里的省略号是java代码的一部分,它表明这个方法可以接收任意数量的对象(除fmt参数之外)
实际上,printf方法接收两个参数,一个是格式字符串,另一个是Object[]数组,其中保存着所有的参数(如果调用者提供的是整型数组或者其他基本类型的值,自动装箱功能将把他们转换成对象)。现在将扫描fmt字符串,并将第i个格式说明符与args[i]的值匹配起来。
换句话说,对于printf的实现者来说,Object...参数类型与Object[]完全一样。
用户可以自己定义可变参数的方法,并将参数指定为任意类型,甚至是基本类型。
实例(计算若干个数值的最大值):
public static double max(double...values) {
double largest=Double.NEGATIVE_INFINITY;
for(double v : values) if(v>largest) largest=v;
return largest;
}
可以像下面这样调用这个方法:
double m=max(3.1,40.4,-5);