一、可变参数简介

在不确定参数的个数时,可以使用可变的参数列表。

1. 语法:
参数类型…(三个点)

例如: void printArray(Object…)

注意: 每个方法最多只有一个可变参数,因为:可变参数必须是方法的最后一个参数

2. 可变参数的类型
可变参数可以设置为任意类型:引用类型,基本类型;当然也会进行类型检查的;

3. 参数的个数:

  • 0个参数
  • 1个参数: 如果是数组,那么就直接将这个数组作为参数传进方法里面,不再填充新的数组;
  • 多个参数: 参数可以是数组,也可以是单个变量、常量;但是这时候会,将这些参数填充进新的数组里面,再将这个数组,传进方法里面;

4. 可变参数的使用

可变参数完全可以当作一个数组来使用,或者说,本质上可变参数就是一个数组(下面详细介绍)。所以,数组拥有的方法、属性,可变参数一样拥有。

public void varArgMethod(int b,int... arr) {//和数组一样,拥有属性lengthint lenth = arr.length;//索引遍历for(int i=0;i<arr.length;i++) {System.out.println(arr[i]);}//forEach循环遍历for(int ele:arr) {System.out.println(ele);}
}

上面的例子中,可变参数的使用跟数组的使用是完全一样,也就是说,可变参数是可以等价成数组的

  1. 可变参数的方法重载

可变参数列表的方法的重载不同于普通方法: 无法仅通过改变 可变参数的类型,来重载方法。

如:varArray(int... a)varArray(Object... a),这两个方法在调用时会出错,方法重载失败。

二、 深入分析可变参数的原理

前面已经很详细地介绍了可变参数的各个方面。这一小节将深入去了解可变参数的实现原理,特别是为什么可变参数的使用与数组是一样的。

看下面一个简单的例子:

public class MyTest{public static void main(String[] args) {int a = 100;varArgMethod(5, 7,8,9,10,a);}public static void varArgMethod(int b,int... arr) {//索引遍历for(int i=0;i<arr.length;i++) {System.out.println(arr[i]);}}}

例子很简单,为了了解编译器是怎么处理的,我们用jad对上面例子的class文件进行反编译:

public class MyTest {public static void main(String args[]) {int a = 100;varArgMethod(5, new int[]{7, 8, 9, 10, a});//参数列表被编译器处理成了一个int[]数组}public static transient void varArgMethod(int b, int arr[]) { //形参被编译器处理成数组for (int i = 0; i < arr.length; i++)System.out.println(arr[i]);}
}

从反编译的结果可以看出,编译器不仅将可变参数处理成数组varArgMethod(int b, int arr[]),还处理了调用可变参数方法处的参数列表,把参数列表封装进一个数组varArgMethod(5, new int[]{7, 8, 9, 10, a})

现在看来,可变参数列表并没有多神奇,只不过是将程序员做的工作简化了,交给了编译器来处理。最后,可变参数的使用和数组一样也就不出奇了,因为可变参数最后还是被编译器处理成了数组,可变参数就是数组。

java基础篇(10) 可变参数列表介绍相关推荐

  1. java基础(九) 可变参数列表介绍

    一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型-(三个点) 例如: void printArray(Object...) 注意: 每个方法最多只有一个可变参数 ...

  2. Java基础篇:字符串的简单介绍

    你可能注意到了,在前面关于数据类型和数组的讨论中没有提到字符串或字符串数据类型.这不是因为Java不支持这样一种类型,它支持.只是因为Java的字符串类型,叫做字符串(String),它不是一种简单的 ...

  3. 穿越Java - 基础篇 第三章 面向对象介绍 | 第1节 面向对象思想

    面向对象思想 理解: 面向对象更多的是一种思想的体现. 面向过程更多体现的是什么事情都要亲力亲为. 而面向对象跟多体现的是如何指挥别人做事情,只要明确我要干什么即可. 通过将相关或类似的功能 封装在不 ...

  4. java 可变参数列表

    Java SE5添加了可变参数列表特性 参数可以这样定义,(Object-args).可变参数用"..."来定义,args是可变参数的数组.举个例子: package sample ...

  5. 你所需要的java基础篇深入解析大汇总

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

  6. 你所需要的java基础篇和提升篇大总结

    好好学java 致力于java知识分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 诗 近半个月,每天一篇 ...

  7. java 可变参数列表_java中可变参数列表的实现方法

    我们在对可变参数有一定的认识后,可以引申一下它的使用范围.在数组中也会需要参数的传入,那么结合参数的数量不固定,我们在参数类型上也得到了增加,这就是本篇所要讲的可变参数列表.下面我们就java可变参数 ...

  8. php函数可变参数列表,PHP函数可变参数列表的具体实现方法介绍

    也许对于PHP初级程序员来说,对于PHP函数并不能完全熟练的掌握.我们今天为大家介绍的PHP函数可变参数列表的实现方法主要是利用func_get_args(). func_num_args().fun ...

  9. java 可变参数列表 数组_java可变参数列表如何填充数组?

    在对于数组的填充上,我们可以运行参数的传递,把数组作为可变参数的列表进行调整.对于一些参数个数和类型未知的时候,这种方法就能帮助我们解决填充数组的难题,因为这种方法并不需要提前知道.下面我们就可变参数 ...

最新文章

  1. Apache与Tomcat联系及区别(转)
  2. 四、MySql七个查询命令中哪些命令执行效率过慢
  3. linux删除非空目录
  4. 数据结构与算法笔记(五)——队列(FIFO队列、双端队列)
  5. android 字体加下划线,android自定义带下划线EditText解决文字压线的问题
  6. python 打开网页 并填表单_Windows下使用python3 + selenium.webdriver功能实现自动填写网页表单功能...
  7. 聊聊Interlocked.CompareExchange吧?
  8. 三相同步电机怎么接线图_三相电度表怎么看倍数
  9. SQL Server中的列存储索引
  10. DNF最新纯图色脚本框架2022-4-27
  11. RadASM资源链接错误RC2104及找不到resource.h解决方案
  12. java Http请求工具类【post/get】
  13. java获取本地真实ip
  14. Matlab影像像素坐标得到经纬度/经纬度转影像坐标(已知经纬度获取影像DN值)
  15. 通讯录管理系统 C++
  16. 实用Ip、手机、身份证归属地查询API
  17. 计算机主板是cpu吗,主板和cpu是一起的吗
  18. python绘制小提琴图_matplotlib 小提琴图(violin plot)
  19. Excel怎么批量在工作表名称后添加文本
  20. ESPIDF开发ESP32学习笔记【WiFi实现】

热门文章

  1. c语言用户态锁使用,用户态自旋锁、读写自旋锁及互斥锁
  2. DBeaver 驱动安装
  3. 图像处理 图像相似算法aHash、dHash、pHash解析与对比
  4. bzoj4570: [Scoi2016]妖怪【凸包+对勾函数最小值】
  5. 1.冯诺依曼体系结构组成及其特点
  6. ASP.Net: EshineASPNet教程-支付机构支付模块
  7. 汇编语言 王爽第二版 总结
  8. 前端 vue + element + vux
  9. <第六、七周>新店日记,shopee怎么怎么开广告?怎么定价比较合理?
  10. 锁屏密码锁、图案锁忘记怎么办?简单利用adb删除(部分机型可用)