JDK5新特性系列:可变参数

  在进入正题之前我们先来看一个简单的案例,它的需求是这样的:我们有一个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属性,可变参数应该也有

数组有length属性,可变参数应该也有

证明三:两个方法,一个用可变参数,一个用数组,显示方法不唯一。

两个方法,一个用可变参数,一个用数组,显示方法不唯一。

证明四:反编译

反编译

总结:

可变参数实际上就是数组,它是java给我们提供的一个语法糖。 注意:可变参数必须作为方法的最后一个参数而存在,避免参数的歧义.

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jayden 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值