java變長參數,是怎樣變長的?

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的一顆語法糖,其本質上是用數組形式來實現。

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章