在进入正题之前我们先来看一个简单的案例,它的需求是这样的:我们有一个Shoes类,在该类中有鞋子的名字name,鞋子的价钱price,以及要购买的鞋子的数量num。
@SuppressWarnings("all") public class Shoes { private String name; private Integer price; private Integer num; public Integer getPrice() { return price; } public Integer getNum() { return num; } public Shoes() { } public Shoes(String name, Integer price, Integer num) { super(); this.name = name; this.price = price; this.num = num; } }
我的需求是定义一个方法,**该方法的功能是求出所购买的鞋子的总价格。**为了读者更能理解上句话的意思,我给出一个让人舒适的场景:有一天帅帅的你(或者美美的你)进了大型商场,对服务员说,给我来100双阿迪达斯,1000双大迪奥,再来500双匡威。**给我算算多少钱?**现在简单明了了吧!
了解需求后,我们不难写出下面的代码,就像这样:
package com.lanou.jdk5.variableparameter; public class TestMain { public static void main(String[] args) { Shoes shoes1 = new Shoes("科比11代", 2000, 5); Shoes shoes2 = new Shoes("满天星", 800, 1); Shoes shoes3 = new Shoes("三叶草", 1200, 1); Shoes[] shoess = {shoes1,shoes2,shoes3}; int price = countTotal(shoess ); System.out.println(price); } //定义一个计算商品总价的方法 public static int countTotal(Shoes[] shoess) { int ret = 0; for (int i = 0; i < shoess.length; i++) { ret += shoess[i].getPrice()*shoess[i].getNum(); } return ret; } }
完成需求后我们来考虑这样一个问题:
如果Shoes对象的数量不确定怎么办?我们知道定义数组时,长度是不可变的。假设你是鞋店老板,你怎么知道顾客要买几双鞋子?
其实这个问题解决的方法很简单,数组长度不可变,那我使用集合ArrayList呗。ArrayList不就是动态数组。这时候我们的解决办法是:使用长度可变的集合存储Shoes对象,List list = new ArrayList<>();但是这种方式依然存在问题:我们需要将list集合通过toArray()方法转成数组,但是toArray()方法的返回值是Object[]。我们每次都需要强转,这是非常不方便的。
我知道很多初学者看博客时是非常抵抗代码的,所以针对这种解决方式,这里不再给出代码,好奇心强的同学可以看看上面的释自己实操一遍,相信有所裨益。
通过一个简单案例,以及没有可变参数之前,我们的前辈是如何解决上述问题的方法后,正式引出我们本文的主角–**可变参数。可变参数,顾名思义就是可以改变参数数量的参数。**而可变参数相信大家在学习中也有接触过,但是却只知其然,却不知其所以然。下面先贴出可变参数的写法,然后在来证明一下,实际上可变参数就是一种语法糖(不知道概念的百度一下,就是简化代码,方便开发)。
package com.lanou.jdk5.variableparameter; public class TestMain { public static void main(String[] args) { Shoes shoes1 = new Shoes("科比11代", 2000, 5); Shoes shoes2 = new Shoes("满天星", 800, 1); Shoes shoes3 = new Shoes("三叶草", 1200, 1); Shoes[] shoess = {shoes1,shoes2,shoes3}; int price = countTotal(shoess ); System.out.println(price); } //定义一个计算商品总价的方法 public static int countTotal(Shoes... shoess) { int ret = 0; for (int i = 0; i < shoess.length; i++) { ret += shoess[i].getPrice()*shoess[i].getNum(); } return ret; } }
如果复制代码敲了的同学或者观察认真的同学已经发现,第一版代码和最终的代码就一个地方不一样,**只是把参数中的符号[]改成了… ,其余代码一点不变。这时候我猜想:实际上可变参数就是一个数组!**下面我们会来证明我们的猜想。由于csdn只能放优酷视频,所以移步到知乎看到吧,有十来秒的演示,对理解非常有帮助!
证明一:在可变参数方法中打印数组,显示是数组类型
证明二:数组有length属性,可变参数应该也有
证明三:两个方法,一个用可变参数,一个用数组,显示方法不唯一。
证明四:反编译
总结:
可变参数实际上就是数组,它是java给我们提供的一个语法糖。 注意:可变参数必须作为方法的最后一个参数而存在,避免参数的歧义.