可以提供参数个数可变的方法(有时,这些方法被称为“变参”(varargs) 方法)前面已经看到过这样一个方法:printf。例如,下而的方法调用:
System.out.println("%d" ,n);
和
System.out.printf("%d %s", n ,"widgets");
这两条语句都调用同一个方法,不过,一个调用有2个参数,另一个调用有3个参数。
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[] 完全一样。
编译器需要转换每个printf 调用,将参数打包到一个数组中,并根据需要自动装箱:
System.out.printf("%d %s", new Object[] ( Integer.value0f(n),"widgets" ) );
你自己也可以定义有可变参数的方法,可以为参数指定任意类型,甚至是基本类型。下面是一个简单的示例,这个函数会计算若干个数值中的最大值(数值个数可变)。
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);
编译器将 new double[]{3.1 , 40.4 , -5} 传递给max 函数。
注释:允许将数组作为最后一个参数传递给有可变参教的方法。例如:
System.out.printf("%d %s" , new Object[]{Integer.valueOf( i ), "widgets"})
因此,如果一个已有函数的最后一个参数是数组,则可以把它重新定义为有可变参数的方法,而不会破坏任何已有的代码。例如,Java5中就采用这种方式增强了MessageFormat.format。如果愿意,甚至可以将main 方法声明为以下形式:
public static void main(String... args)