本文索引
一、簡介
二、可變參數(Varargs)
三、結論
日期:2019 年 9 月 13 日
一、簡介
在我們設計函式時,參數的傳入是不可避免,而當這個函式需要傳入大小與數量不定的參數時, 我們往往都會這樣宣告:
public void example( Object[] objects ){
    //do something...
}

而在使用這函式時,通常都需要這樣寫,不管是幾個物件都需要直接 New 出一個陣列傳入。
example( new String[]{ "Apple", "banana" } );
example( new String[]{ "grape" } );
雖然也是可以這樣,但是人總是很懶嘛,有時就多打那幾個字也覺得累。
二、Varargs
而在 Java 與 C/C++ 中有提供 "Varargs" ,用來宣告傳入參數不定的函式,我們看以下的範例:
public void example( String ... objects ){
    for (String str : objects) {
        System.out.print(str + " ");
    }
    System.out.println();
}
可以看到 String 與 objects 中間多了 3 個點 "...",不用懷疑,這個就是這樣宣告的。
而在這樣宣告後,我們可以使用這些種類來呼叫此函式:
example( );                                   //沒傳入參數
example( "orange" );                           //傳入 1 個
example( "Apple", "banana" );                   //傳入 2 個
example( "strawberry", "papaya", "guava" );       //傳入 3 個
example( new String[]{"grape", "pineapple"} );   //舊方法傳入
結果:
orange
Apple banana
strawberry papaya guava
grape pineapple
以這樣來看,Varargs 是否提供了許多方便呢?但是他還是有許多上的限制,例如它一定要在最後一個參數:
錯誤:
//compiler error
public static void example( String ... objects, int interger ){
    //do something...
}
正確:
//no error
public static void example( int interger, String ... objects ){
    //do something...
}
同型態也正確:
//no error
public static void example( String str, String ... objects ){
    //do something...
}
三、結論
除了 Java 有 Varargs 以外,C/C++ 也有提供類似的功能,像是我們熟悉的 printf、scanf 也都有用到這個功能,所以說這個功能實在是非常好用的阿!