可變參數
> 有了可變參數,就再也不用顯式的編寫數組語法了,當你指定參數時,編譯器實際上會爲你去填充數據。但是你獲取的仍舊是一個數組。所以print() 可以使用forech來迭代該數組的原因,但是,這不僅僅只是從元素列表到數組的自動轉換,請注意程序中倒數第二行,一個Interger數組(通過使用自動包裝而創建的),被轉型爲一個Object數組(以便移除編譯器警告信息),並且傳遞給了printArray(),很明顯,編譯器會發現它已經是一個數組了,所以不會在其上執行任何轉換。因此,如果你有一組事物,可以把他們當作列表傳遞,而如果你已經有了一個數組,該方法可以把他們當作可變參數列表來接收。
public class OptionalTrailingArguments {
static void f(int required, String... trailing){
System.out.print("required:"+required+" ");
for(String s:trailing){
System.out.print(s+" ");
}
System.out.println();
}
public static void main(String[] args){
f(1,"one");
f(2,"two","three");
f(0);
}
}
/*
required: 1 one
required: 2 two three
required: 0
*/
這個程序還展示了你可以如何使用具有Object之外類型的可變參數列表。這裏所有的可變參數都必須時String對象。在可變參數列表中可以使用任何類型的參數,包括基本類型。但是可變參數列表中沒有任何元素,那麼轉變成數組的長度爲0。
注意:可變參數會將重載過程變得負責。儘管乍一看顯得足夠安全。
public static void f(Character... args){
System.out.print("first");
for (Character c: args) {
System.out.print(" " + c);
}
System.out.println();
}
public static void f(Integer... args){
System.out.print("first");
for (Integer c: args) {
System.out.print(" " + c);
}
System.out.println();
}
public static void f(Long... args){
System.out.print("first");
for (Long c: args) {
System.out.print(" " + c);
}
System.out.println();
}
public static void main(String[] args) {
f('a','b','c');
f(1);
f(2,1);
f(0);
f(0L);
// f(); 不能進行編譯
}
以上可變參數方法中,在每一種情況中,編譯器都會使用自動包裝機制來匹配重載的方法,然後調用最明確匹配的方法,但是在不使用參數調用f(),編譯器就無法知道應該調用哪一個方法了。