java方法支持變長參數。這樣能夠極大地簡化我們的編程。我們看這樣一段代碼:
public class Args {
public static void main(String[] args) {
String two = stringConcat("A", "B");
String three = stringConcat("A", "B", "C");
}
public static String stringConcat(String... objs) {
String sum = "";
for (String s : objs) {
sum += s;
}//for
return sum;
}
}
在JDK1.8.0_151的環境下,我們利用javac編譯上面的源代碼,得到Args.class字節碼文件。
利用javap反編譯了Args.class字節碼文件,截取StringConcat方法的反編譯結果。如圖:
爲什麼會出現,arraylength指令,難道,變長參數和數組有什麼關係?大膽假設,小心求證。
我們藉助於IDEA, 反編譯Args.class字節碼文件,以得到更直觀的結果:
請注意,我用紅筆畫出的部分。因爲它證明了我的猜想,的確,變長參數是通過數組來實現的。
再用jd-gui來看看反編譯結果。
看到標出重點的部分,jd-gui的反編譯結果再次驗證了我們的猜想。
我們改寫文章開頭的代碼,改成如下形式:
public class Args {
public static void main(String[] args) {
String two = stringConcat("A", "B");
String three = stringConcat("A", "B", "C");
System.out.println(two);
System.out.println(three);
}
public static String stringConcat(String... objs) {
String[] arr = objs;
int length = arr.length;
String sum = "";
for (int i = 0; i < length; i++) {
sum += arr[i];
}//for
return sum;
}
}
同樣,在JDK1.8.0_151環境下,我們嘗試編譯並運行這段代碼,看它是否可以正常工作。
如圖:
程序正常通過編譯,併成功運行。 我們用【javap -c Args.class】反編譯看看StringConcat方法:
arraylength指令出現了。用IDEA反編譯結果如下:
除了那兩行輸出,其餘是不是和前面的IDEA反編譯結果一模一樣。這也證明了我們的猜想。
【結論】:java的變長參數,是java的一顆語法糖,其本質上是用數組形式來實現。