Java可變引數型別與陣列的區別聯絡
阿新 • • 發佈:2018-12-11
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);// 編譯錯誤
}
}
從上面程式碼可看出,可變引數是相容陣列類引數的,但是陣列類引數卻無法相容可變引數。
同時,可變引數型別必須作為引數列表的最後一項,而不能放在定長引數的前面。