本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在进入正题之前我们先来看一个简单的案例,它的需求是这样的:我们有一个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;
}
}
如果复制代码敲了的同学或者观察认真的同学已经发现,第一版代码和最终的代码就一个地方不一样,只是把参数中的符号[]改成了... ,其余代码一点不变。这时候我猜想:实际上可变参数就是一个数组! 下面我们会来证明我们的猜想。
证明一:在可变参数方法中打印数组,显示是数组类型
证明二:数组有length属性,可变参数应该也有
证明三:两个方法,一个用可变参数,一个用数组,显示方法不唯一。
证明四:反编译
总结:
可变参数实际上就是数组,它是java给我们提供的一个语法糖。
注意:可变参数必须作为方法的最后一个参数而存在,避免参数的歧义.