导语:

对于public static void changeVarLength(String ... str) { ...; }这种形式参数都见到过吧,后面就会将参数数量可变的方法需要注意的事项进行讲解,通过举例来实际证明.


一、可变参数的定义

在jdk 1.5 之后 , 方法的参数可以通过省略号...来作为一部分 , 即(String ... str) , 这种形式其实是语法糖 , 实际上相当于 (String[ ] str) .

通过...这种形式的参数 , 表明这个方法可以接受任意数量的对象.

为什么这里说的是接受的是任意数量的对象呢?常量不行么?比如传进去一个int类型的1,会怎样呢?

答 : 其实很好理解,传进去的肯定是对象类型, ...本质是语法糖 , 比如public static void printArr(int ... i){ ... }实际上相当于public static void printArr(int[ ] i) { ... } , 那么当你调用printArr方法时,传进1,肯定会报错,这是其实在编译阶段,会将传进去的1转换为new int[] {1}传进去的是一个数组.

public class VarPara {public static void changePara(Object ... obj) {for(Object o : obj) {System.out.println(o);}
}

二、可变参数方法的调用

调用时可以是传进去任意数量的参数

例 :
changePara();
changePara(1);
changePara(1, 2);

对于参数,除了会将参数绑定到数组上,必要时还会进行自动装箱.
例如 :

public class ChangeVarLength {public static void main(String[] args) {changePara();changePara(1);changePara(1, 2);}public static void changePara(Object... obj) {for (Object o : obj) {System.out.println(o);}}
}

反编译后代码 :

public class ChangeVarLength
{public ChangeVarLength4(){}public static void main(String args[]){changePara(new Object[0]);changePara(new Object[] {Integer.valueOf(1)});changePara(new Object[] {Integer.valueOf(1), Integer.valueOf(2)});}public static transient void changePara(Object obj[]){Object aobj[] = obj;int i = aobj.length;for (int j = 0; j < i; j++){Object o = aobj[j];System.out.println(o);}}
}

三、可变参数的使用原则

3.1 一个方法只能有一个可变的参数,并且这个参数必须是该方法的最后一个参数

正确形式 :

public static void test1(String ... str) { // TODO }
public static void test2(String str, String ... str1) { // TODO }
public static void test3(String str, String str1, String ... str2) { // TODO }

3.2 如果重载了可变参数的方法, 优先调用匹配定长参数的方法,不定参数的那个重载方法是最后被选中的。

public class ChangeVarLength5 {public static void main(String[] args) {chanVar(1);chanVar();chanVar(1, 2);}public static void chanVar(int intArr) {System.out.println("具体参数");}public static void chanVar(int... intArr) {System.out.println("可变参数");}
}

输出结果 :

3.3 对于可变参数的方法,既可以接受多个形式参数类型的参数,也可以接受形式参数类型的数组; 但是方法参数为数组只能接受数组.

在方法调用时也提到,调用时,如果传入的是(1, 2, 3),则会在编译的时候将其绑定数组为new int[ ] {1, 2, 3}, 所以对于可变参数方法,可以接受两种形式的参数.

然而对于方法参数为数组的方法而言, 则只能接受数组类型的参数.否则将会报错!

3.4 方法调用时,同时满足两个方法,编译器将会产生错误

public class ChangeVarLength6 {public static void main(String[] args) {chanVar(1);chanVar(1, 2);chanVar();}public static void chanVar(int ... intArr) {System.out.println("具体参数");}public static void chanVar(int i, int... intArr) {System.out.println("可变参数");}
}

对于上面的代码,运行结果是什么呢?

抱歉,编译器直接报错,因为调用的不清楚是哪个方法. 因此直接报错.

如果传入1的话,int ... intArr可以通过将1转为new int[ ] {1}满足该方法chanVar(int ... intArr), 同时也可以满足chanVar(int i, int... intArr),将传入的转为chanVar(1, new int[0]);,因此分不清该调用哪一个了而报错.

3.5 对于继承,子类将父类方法的参数列表数组形式改为可变参数数量属于重写,但是指向子类的父类调用该方法是形参列表由父类决定.

public class ChangeVarLength2 {public static void main(String[] args) {// 向上转型Base base = new Sub();base.print("hello");// 不转型Sub sub = new Sub();sub.print("hello");}
}// 基类
class Base {void print(String[] args) {System.out.println("Base......test");}
}// 子类,覆写父类方法
class Sub extends Base {@Overridevoid print(String... args) {System.out.println("Sub......test");}
}

对于base.print("hello");直接编辑器报错

原因 : 因为父类参数列表是数组,因此传入字符串类型肯定会报错.
如果父类参数列表为可变参数的话,子类是数组类型.那么base.print("hello");在编译阶段会将这个语句变为


上图形式也属于重写,指向子类的父类调用print方法时,将调用子类重写的方法.这是既可以传数组,也可以传递多个String类型的参数.

3.6 如果向可变长参数的方法传入空参的话,将会new一个对应类型的数组,且长度为0.

如果传入null的话 :
反编译后 :
直接传入null,形式未改变.


参考博客 :
Java中可变长参数的使用及注意事项

扩展 :
【Java】变长参数的坑

参数数量可变的方法 - Java相关推荐

  1. 对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 自动拆箱(装箱).printf的参数数量可变 以及 枚举类的详细说明: 0.2) 源代码: h ...

  2. 《Java 核心技术卷1 第10版》学习笔记------ 参数数量可变的方法

    public PrintStream printf(String fmt , Object... args) { return format(fmt, args); } Object-参数类型与 Ob ...

  3. Matlab_参数数量可变_笛卡尔积_Cartesian product

    使用网格测试测试算法时,算法有多个参数,最终参数的集合实际上是每一个参数集合的笛卡尔积. function C = cartesian(varargin)args = varargin;n = nar ...

  4. 【作业】随机数+参数可变的方法+实验任务(输出素数+使用递归,判断是否为回文+统计一篇英语问斩单词出现频率)...

    (1)随机数 取余的m很大可以保证随机的更彻底,更不容易重复 1 import java.util.Scanner; 2 public class Text_001 3 { 4 5 public st ...

  5. Java---形参个数可变的方法

    1>从JDK 1.5以后,Java允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参. 定义形参个数可变的方法: 2>定义参数个数可变的方法:在方法最后一个形参的类型后面增加三 ...

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

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

  7. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

    具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...

  8. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

  9. java中形参可变的方法

    之前上C语言的时候老师给我们讲过printf();函数,老师问我们有没有觉得这个函数很神奇,因为他传入的参数是不确定的. 这是怎么实现的,老师之前给我说了红黑树,来传递参数,刚才看见了java中实现形 ...

  10. 《CLR Via C# 第3版》笔记之(十) - 可选参数和可变数量参数

    C#中也可以像动态语言那样,定义可选参数和可变数量参数.通过使用可选参数和可变数量参数可以构建更加灵活的函数. 主要内容: 可选参数 可变数量参数 1. 可选参数 可选参数即调用函数时,传递参数的个数 ...

最新文章

  1. NLP重要模型详解,换个方式学(内附资源)
  2. BiLSTM+CRF的损失由发射矩阵和转移矩阵计算而得 BiLSTM+CRF命名实体识别:达观杯败走记(下篇
  3. DL之GoogleNet:GoogleNet(InceptionV1)算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. 技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘
  5. 应对不良网络文化的技术之一——网络信息抽取技术
  6. Centos6.5升级GCC
  7. Log4j框架配置文件
  8. 程序员离职代码交接_程序员离职大半个月,被老板命令回单位讲代码,员工:一次1万...
  9. restTemplate设置访问超时
  10. 2013年美国国情咨文总结
  11. 联系人排序java代码_Android仿微信联系人按字母排序
  12. 理解运放的虚断和虚短
  13. 天涯明月刀java_天涯明月刀61副本 天涯明月刀副本详情介绍
  14. 乐橙机器人的价格_乐橙育儿机器人app-大华乐橙机器人app(乐橙宝宝)下载V1.00.001-西西软件下载...
  15. 计算机关机键是,电脑关机快捷键是什么
  16. 爱普生Me330 打印机改装连供系统计划
  17. 备战一年,终于斩获腾讯T3,我坚信成功是可以复制的
  18. 戴尔g3最新版的声卡,有可能导致插上耳机没有声音
  19. CAD图纸中插入或删除编号的图文教程
  20. 清代黄自元 间架结构92法的现代文注释

热门文章

  1. 关于 Unbalanced calls to begin/end appearance transitions
  2. 干货 | 硬件设计基础60问
  3. 2021年化工自动化控制仪表考试内容及化工自动化控制仪表作业考试题库
  4. 【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
  5. Excerpt-16 March, 2019
  6. 【React】unmountComponentAtNode卸载组件
  7. 【CP2K教程(一)】元动力学(metadynamics)与增强采样技术
  8. 怎么调linux系统的屏幕刷新率,怎么改屏幕的刷新率?
  9. 交友网站界面设计+数据库设计
  10. 中文的括号和英文的括号区别_工具推荐 含笔顺及英文的汉字书写练习纸