简述

Java 方法的声明的格式是 修饰符 返回类型 方法名(参数列表){方法体}
参数列表中可以有0个或者多个参数,参数的类型可以是基本类型也可以是引用类型,非常灵活,而且,还可以用同名但是参数列表不同的方法组成重载的方法,为程序设计与实现提供了很大的便利。在jdk1.5之后,Java引入了一种新的方法参数列表的声明方式:可变长度参数

可变长度参数,就是使用一种特殊标记声明方法的参数列表,然后在调用方法的时候,可以传入任意个数的实参。有资料称可变长度参数为“可变参数”,这是有些不妥的,因为实际上“可变”的含义仅仅是参数长度(也可以说是参数个数)是可变的,参数的类型仍然是在声明的时候就唯一确定了(使用Object也是唯一确定的特殊情况)。
可变长度参数声明时,与普通参数的区别就是参数类型的后面紧跟了三个点号。

使用演示

通过一个整数求和的例子演示可变长度参数的使用。

public class Demo {public static void main(String[] args) {System.out.println(sum());System.out.println(sum(1));System.out.println(sum(1, 2));System.out.println(sum(4, 6, 1, 3));}public static int sum(int... nums) {int sum = 0;for (int i : nums) {sum += i;}return sum;}
}

运行上面的程序,结果符合预期,分别打印了 0,1,3,14。

实现原理

Java 最后将可变长度的参数封装成为一个数组。数组元素的类型就是可变长度参数的类型(即…之前的类型,在上面的例子中就是 int),数组的名称是参数名称(在上面的例子中是 nums)。

使用限制

变长参数给编程带来了很大的便利,但是同时也可能会引发一些新的问题,为了能够正确无歧义地使用变长参数,Java对变长参数做出如下限制:

  • 变长参数必须是方法中的最后一个参数,避免无法区分变长参数和普通参数;

    public int fun(int... args, int a){} // 错误代码示例
    

    如上面的代码所示,如果有调用int num = fun(1, 2, 3, 4)并不能严格地认为123是args参数,4是a参数。

  • 一个方法不能定义多个变长参数,避免参数错位;

  • 变长参数位置如果被同等类型数组替代,不能构成重载,因为本质上是一个方法。

    public static void fun(int...nums) {}
    
    public static void fun(int[] nums) {}
    

    上面的两个方法实际是一个方法,在同一个类中不能通过编译。

数组还是可变长度参数

既然可变长度参数在本质上就是一个数组,在实参传递的时候也可以直接传递一个数组进去,为什么不直接使用数组而要使用可变长度参数呢?

  1. 在参数个数是0的情况下,如果是数组参数,也必须传递一个元素个数为0的数组。
  2. 在参数个数很少的情况下,省掉了将参数封装为数组的环节,使用很方便。

使用场景

在上面的使用演示程序中,实现了一个数字相加的功能,因为不确定是多少个数字相加,所以采用了变长参数。
在JDBC的接口定义中,一般会定义查询和更新操作的方法,查询和更新都需要传入预编译的SQL语句以及SQL语句中的占位符参数。接口方法如下:

ResultSet query(String sql, Object...params);
int update(String sql, Object...params);

Java 可变长度参数相关推荐

  1. java 可变长度参数/动态参数...

    示例1 可变长度参数必须是参数列表中的最后一个,不然会报错 String ...paramMore与String...paramMore.String... paramMore等效 import or ...

  2. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  3. 【java】深入了解JAVA可变长度的参数

    到J2SE 1.4为止,一直无法在Java程序里定义实参个数可变的方法--因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时 ...

  4. java变长参数_Java可变长度参数

    术语"varargs"是"variable-length arguments"(可变长度参数)的缩写. 可变长度参数声明一个接受可变数量的参数(或参数)的方法或 ...

  5. java 参数三点,java函数参数类型后添加三点的用法

    类型后面三个点(String...),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟...,表示此处接受的参数为0到多个Object类型的对象,或者 ...

  6. java中参数“ ...“的用法和意思

    Object ...os这种写法是从Java 5开始的,Java语言对方法参数支持一种新写法,叫可变长度参数列表. 表示此处接受的参数为0到多个Object类型的对象,或者是一个Object[] 注意 ...

  7. Scala可变长度参数和:_*使用

    1. 可变长度参数 cala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表.想要标注一个重复参数,在参数的类型之后放一个星号. scala> def ech ...

  8. 关于java多参数的传值问题解析

    https://blog.csdn.net/chenzl0723/article/details/78800819 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 I ...

  9. scala调用java可变参数函数

    如图java 版本中,ShardJedis 中有一可变参数的函数 public List<String> hmget(String key, String... fields) {Jedi ...

最新文章

  1. 写给Python开发者:机器学习十大必备技能
  2. 又一个放弃P10千万年薪出走阿里的CTO!
  3. Eclipse使用Maven时出现:Index downloads are disabled, search results may be incomplete.问题解决...
  4. php 手机唯一标示_Php获取移动设备唯一标识
  5. 抑郁症自测量表测试软件,快来测测抑郁--抑郁自评量表 (此表是是收费工具,我献给大家)...
  6. 王爽汇编第九章学习笔记
  7. 179. 最大数---LeetCode---JAVA
  8. 通过简单的Spring方面摆脱null参数
  9. [渝粤教育] 西南科技大学 货币银行学 在线考试复习资料(1)
  10. 关Jquery判断input type=checkbox元素是否被选中的判断
  11. display:none的表单也会被提交
  12. mysql事件不定时执行_Mysql 中的事件//定时任务
  13. <Android开发> Android开发工具- 之-I2C TOOLS工具使用
  14. 【怎样防止黑客入侵电脑 九个设置让电脑远离黑客】
  15. SD-销售订单数量修改需大于已交货数量,消息报错而非警告调整
  16. 基于 Agora SDK 实现 macOS 端的一对一视频通话
  17. 清除异常关闭进程的任务栏托盘区残留图标
  18. java基础语法(继承)
  19. 什么是MySQL| 什么是数据库 | 数据库详解
  20. Nginx的Https配置及代理api接口配置

热门文章

  1. ServerStatus-Toyo 服务器探针安装 解决Github无法访问问题
  2. 基于Bert的智能对话机器人
  3. 化工原理物性参数_(完整版)化工原理知识点总结整理
  4. 曲线任意里程中边桩坐标正反算(CASIO fx-4850P计算器)程序第四次修改版
  5. 《智能步态识别门禁系统》,基于深度学习的多人步态识别系统
  6. 用matlab画多普勒加宽线性函数,MTD雷达中多普勒滤波器组的设计与实现
  7. 黄金跳槽期到了,一个优秀程序员的简历应该怎么写
  8. ssm毕设项目智慧民政服务平台xl2r9(java+VUE+Mybatis+Maven+Mysql+sprnig)
  9. Linux bz2文件解压
  10. CAD文件版本怎么转换?怎么将高版本文件转换成低版本