Java編程思想-閱讀01

可變參數

> 有了可變參數,就再也不用顯式的編寫數組語法了,當你指定參數時,編譯器實際上會爲你去填充數據。但是你獲取的仍舊是一個數組。所以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(),編譯器就無法知道應該調用哪一個方法了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章