1. 程式人生 > >Java可變引數型別與陣列的區別聯絡

Java可變引數型別與陣列的區別聯絡

Java方法中的可變引數型別是一個非常重要的概念,有著非常廣泛的應用,本文對此加以分析。如下: 


public class TestVarArgus {
    public static void dealArray(int... intArray) {
 
    }
 
    public static void main(String args[]) {
 
    }
}

可變的引數型別,也稱為不定引數型別,英文縮寫是VarArgus。通過名字可以看出來,其在接收引數的時候,引數個數是不定的。現在就先來呼叫下這個方法:

public class TestVarArgus {
    public static void dealArray(int... intArray) {
        for (int i : intArray){
            System.out.print(i + " ");
        }
        System.out.println();
    }
 
    public static void main(String args[]) {
        dealArray();
        dealArray(1);
        dealArray(1, 2, 3);
    }
}

輸出:

1   

1 2 3

事實上,編譯器會把這最後一個形參轉化為一個數組形參,並在編譯出的class檔案裡作上一個記號,表明這是個實參個數可變的方法:

dealArray();//dealArray(int[] intArray{}); 
dealArray(1);//dealArray(int[] intArray{1}); 
dealArray(1,2,3);//dealArray(int[] intArray{1, 2, 3}); 

那麼這個可變引數就是陣列類引數嗎?如下:

public class TestVarArgus {
    public static void dealArray(int... intArray) {
        for (int i : intArray){
            System.out.print(i + " ");
        }
        System.out.println();
    }
    public static void dealArray(int[] intArray) {
        // 會有Duplicate method dealArray(int[]) in type TestVarArgus的錯誤
        for (int i : intArray){
            System.out.print(i + " ");
        }
        System.out.println();
    }
 
    public static void main(String args[]) {
        dealArray();
        dealArray(1);
        dealArray(1, 2, 3);
    }
}

可以看到,這兩個方法是衝突的,是無法過載的。

兩個小測試:

public class TestVarArgus {
    public static void dealArray(int... intArray) {
        for (int i : intArray){
            System.out.print(i + " ");
        }
        System.out.println();
    }
 
    public static void main(String args[]) {
        int[] intArray = { 1, 2, 3 };
        dealArray(intArray);// 通過編譯,正常執行
    }
}
public class TestVarArgus {
    public static void dealArray(int[] intArray) {
        for (int i : intArray){
            System.out.print(i + " ");
        }
        System.out.println();
    }
 
    public static void main(String args[]) {
        dealArray(1, 2, 3);// 編譯錯誤
    }
}

從上面程式碼可看出,可變引數是相容陣列類引數的,但是陣列類引數卻無法相容可變引數。

同時,可變引數型別必須作為引數列表的最後一項,而不能放在定長引數的前面。