在进入正题之前我们先来看一个简单的案例,它的需求是这样的:我们有一个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给我们提供的一个语法糖。 注意:可变参数必须作为方法的最后一个参数而存在,避免参数的歧义.

JDK5新特性系列:可变参数相关推荐

  1. JDK5 新特性之 可变参数的方法(2)---asList

    > Arrays.asList(T - a)方法的使用 >UnsupportedOperationException分析 Arrays.asList(T - a)方法的使用 package ...

  2. Java1.5增加了新特性:可变参数

    /* Java 可变参数 Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有 ...

  3. jdk1.5之后的新特性之可变参数

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有一个不是最后一项,所以只支 ...

  4. C++11新特性之 可变参数模板

    C++ 11的可变模版参数是其新增的最强大的特性之一.通过对参数进行了泛化,可以表示从0到任意个数.任意类型的参数.我们知道对于一个模板类来说,通常只能含固定数量的模版参数,可变模版参数无疑是一个巨大 ...

  5. 圣思园java se培训总结(58-)(java1.5新特性,可变参数,包装类)

    Integer 会有一个数组缓存,缓存-128到127之间 可变参数,必须是方法声明中的最后一个参数!可变参数本质是一个数组,传递参数时可以传离散的数,也可以传一个数组!当然一个方法不能有两个或者两个 ...

  6. 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型

    一.eclipse工具的使用 1. java代码的位置 1) 选择工作空间 workspace  选择一个文件夹存放程序(代码) 不要用中文和空格 2) 新建一个java 工程(Project) 3) ...

  7. JDK5.0新特性系列---目录

    JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...

  8. Kubernetes 1.6新特性系列 | 动态配置和存储类

    导读: Dynamic Provisioning的目标是完全自动化存储资源的生命周期管理,让用户无需过多的关注存储的管理,可以按需求自动动态创建和调整存储资源.StorageClass本质上是底层存储 ...

  9. 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数

    [索引页] [源码下载] 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barri ...

最新文章

  1. pxe cobbler ipmi bmc
  2. MVVM设计模式之精髓简化
  3. 让Elasticsearch飞起来!——性能优化实践干货
  4. 重磅!阿里推出国产开源JDK!
  5. Flask 富文本编辑器
  6. Mac下gradle简介与安装
  7. 推荐系统评估:你的推荐系统足够好吗?
  8. Java基础入门(八)之面向对象二
  9. jQuery获取屏幕宽度和高度
  10. Word中如何删除分隔符?
  11. 流式上传文件到服务器磁盘,通过HTTP将数据从浏览器流式传输到服务器的方法...
  12. java中的implement怎么用?
  13. 科罗拉多州立大学计算机科学,科罗拉多州立大学
  14. 电脑开机没反应如何解决?
  15. 下面列出了 网上招聘,人才招聘,招聘信息,网上求职,招聘机遇,招聘网,人才网,工作网
  16. 2021年塔式起重机司机考试及塔式起重机司机复审考试
  17. pytorch根据开放场景语音文字合成新语音(VoiceLoop)
  18. 浅析FPGA局部动态可重构技术
  19. android 新闻功能列表,news: 用Android基本技术实现的新闻App
  20. PhpStudy简单部署PHP网站项目

热门文章

  1. java 基础 api
  2. 经济学入门十人十书:大师级书单推荐
  3. 微波滤波器——镜像参量法(二)
  4. 数字图像处理 图象压缩
  5. Android突破64K限制
  6. 【shaderforge小实例】 遮罩
  7. mysql日期格式化比较_MYSQL DATE_FORMAT() 函数时间大小比较
  8. P3119 [USACO15JAN]草鉴定Grass Cownoisseur 缩点 topo或最长路
  9. 【调剂】211云南大学2020年硕士研究生招生调剂通知
  10. iOS使用自定义字体