可以提供參數(shù)數(shù)量可變的方法(有時這些方法被稱為“變參”(varags)方法)。
前面已經(jīng)看到過這樣的一個方法:printf酥宴。例如灾挨,下面的方法調(diào)用:
?System.out.printf("%d", 1);
?System.out.printf("%d %s", 1, "widgets");
這兩條語句都調(diào)用了同一個方法药薯,不過一個調(diào)用有兩個參數(shù)薄料,另一個調(diào)用有三個參數(shù)。
printf 方法是這樣定義的:
public class PrintStream
{
public PrintStream printf(String fmt, Object... args) {
return format(fmt, args);
}
}
這里的省略號 ... 是 Java 代碼的一部分仍源,它表明這個方法可以接收任意數(shù)量的對象(除 fmt 參數(shù)之外)心褐。
實(shí)際上,printf 方法接收兩個參數(shù)笼踩,一個是格式字符串逗爹,另一個是 Object[] 數(shù)組,其中保存著所有的其他參數(shù)(如果調(diào)用者提供的是整數(shù)或者其他基本類型的值嚎于,會把它們自動裝箱為對象)【蚨現(xiàn)在不可避免地要掃描 fmt 字符串,并將第 i 個格式說明符與 args[i] 的值匹配起來于购。
換句話說袍睡,對于 printf 的實(shí)現(xiàn)者來說,Object... 參數(shù)類型與 Object[] 完全一樣肋僧。
編譯器需要轉(zhuǎn)換每個 printf 調(diào)用斑胜,將參數(shù)綁定到數(shù)組中,并在必要的時候進(jìn)行自動裝箱:
?System.out.printf("%d %s", new Object[] { new Integer(n), "widgets" } );
可以自定義有可變參數(shù)的方法嫌吠,可以為參數(shù)指定任意類型止潘,甚至是基本類型。下面是一個計(jì)算若干數(shù)值中最大值函數(shù)的例子:
public static double max(double... values) {
double largest = Double.NEGATIVE_INFINITY;
for(double v : values) {
if(v > largest) {
largest = v;
}
}
return largest;
}
可以這樣調(diào)用這個方法:
?double m = max(3.1, 40.4, -5);
注釋: 允許將數(shù)組作為最后一個參數(shù)傳遞給有可變參數(shù)的方法辫诅。 例如:
?System.out.printf("%d %s", new Object[] { new Integer(l), "widgets" });
因此凭戴,如果一個已有方法的最后一個參數(shù)是數(shù)組,可以把它重新定義為有可變參數(shù)的方法炕矮,而不會破壞任意已有的代碼么夫。例如,Java 5 中就采用這種方式增強(qiáng)了 MessageFormat.format肤视。如果愿意魏割,甚至可以將 main 方法聲明為以下形式:
?public static void main(String... args)