java变长参数,是怎样变长的?

13 篇文章 0 订阅
1 篇文章 0 订阅

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的一颗语法糖,其本质上是用数组形式来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值