Java方法的可变参数类型实例分析
Java方法中的可变参数类型是一个非常重要的概念,有着非常广泛的应用。本文就以实例形式对此加以分析。具体如下:
一般来说,许多Java初学者在看到下面的这段代码的时候,都会问一个问题:dealArray方法里那三个小点点是什么啊?
publicclassTestVarArgus{ publicstaticvoiddealArray(int...intArray){ } publicstaticvoidmain(Stringargs[]){ } }
这就是本文所要讨论的问题:
publicclassTestVarArgus{ publicstaticvoiddealArray(int...intArray){ for(inti:intArray) System.out.print(i+""); System.out.println(); } publicstaticvoidmain(Stringargs[]){ dealArray(); dealArray(1); dealArray(1,2,3); } }
输出:
1
123
通过main方法里的调用,可以看出来这个可变参数既可以是没有参数(空参数),也可以是不定长的。看到这里估计都能明白,这个不定长的参数其实和数组参数挺像的。事实上,也确实是这么回事儿。编译器会在悄悄地把这最后一个形参转化为一个数组形参,并在编译出的class文件里作上一个记号,表明这是个实参个数可变的方法。请看代码:
dealArray();//dealArray(int[]intArray{}); dealArray(1);//dealArray(int[]intArray{1}); dealArray(1,2,3);//dealArray(int[]intArray{1,2,3});
说到这里,那么可以来验证一下,看看是不是这个可变参数就是数组类参数?看代码:
publicclassTestVarArgus{ publicstaticvoiddealArray(int...intArray){ for(inti:intArray) System.out.print(i+""); System.out.println(); } publicstaticvoiddealArray(int[]intArray){//会有DuplicatemethoddealArray(int[])intypeTestVarArgus的错误 for(inti:intArray) System.out.print(i+""); System.out.println(); } publicstaticvoidmain(Stringargs[]){ dealArray(); dealArray(1); dealArray(1,2,3); } }
从上面这段代码可以看出,这两个方法是冲突的,是无法重载的。到这里,再来做一个有意思的实验:
代码1:
publicclassTestVarArgus{ publicstaticvoiddealArray(int...intArray){ for(inti:intArray) System.out.print(i+""); System.out.println(); } publicstaticvoidmain(Stringargs[]){ int[]intArray={1,2,3}; dealArray(intArray);//通过编译,正常运行 } }
代码2:
publicclassTestVarArgus{ publicstaticvoiddealArray(int[]intArray){ for(inti:intArray) System.out.print(i+""); System.out.println(); } publicstaticvoidmain(Stringargs[]){ dealArray(1,2,3);//编译错误 } }
从上面这两段代码可以看出来,
既然Java方法接收可变参数,那么接下来我们再来看一下下面的代码:
publicclassTestVarArgus{ publicstaticvoiddealArray(intcount,int...intArray){ } publicstaticvoiddealArray(int...intArray,intcount){//编译报错,可变参数类型应该作为参数列表的最后一项 } publicstaticvoidmain(Stringargs[]){ } }
这段代码说明了,可变参数类型必须作为参数列表的最后一项,而不能放在定长参数的前面。估计你会想到一个词“优先级”。因为没有确切的说明,只是这样一种规定,这里可以借用“优先级”这个词来理解一下,请看下面的代码:
publicclassTestVarArgus{ publicstaticvoiddealArray(int...intArray){ System.out.println("1"); } publicstaticvoiddealArray(intcount,intcount2){ System.out.println("2"); } publicstaticvoidmain(Stringargs[]){ dealArray(1,2); } }
代码贴出来估计都知道是输出2,而不是1。这里需要记住:能匹配定长的方法,那么优先匹配该方法。含有不定参数的那个重载方法是最后被选中的。
最后,大家都知道main方法的参数就是一个数组类型的,那么它其实也是可以改成不定参数类型。试一试吧,看看有没有编译错误。
相信本文所述对大家Java程序设计的学习有一定的借鉴价值。
相关文章
- java解析xml方法_详解Java解析XML的四种方法
- java除法保留两位小数_JAVA除法保留小数点后两位的两种方法
- java编程软件下载_Ee Java(Java编程软件) V1.1.0 官方版
- java标识符是什么_Java 标识符「建议收藏」
- 编写java判断闰年_Java 判断闰年代码实例
- java控制台输入数组_Java控制台输入数组并逆序输出的方法实例
- java dom4j 添加节点_Java dom4j获取,添加,删除,查找,设置Element节点方法「建议收藏」
- java常量池在方法区还是堆_JAVA常量池
- Java cast_java concat方法
- java url加密_Java实现url加密处理的方法示例
- java 设置400错误_Java项目报400错误的原因与解决方法
- taskscheduler java_Spring TaskScheduler使用实例解析
- Java面向对象抽象类实例练习详解编程语言
- Java经典实例:按字符颠倒字符串详解编程语言
- Java操作MySQL数据库快速入门(java访问mysql)
- 在Linux中查看Java线程:一种方法(linux查看java线程)
- Java监控MySQL性能:实现数据库运行优化(java监控mysql)
- MacOS下Java开发环境搭建指南(macos开发java)
- 进程Linux下创建多个Java进程的简易方法(linux 多个java)
- Linux与Java调用C编程实战(linux java调c)
- Java和Redis的配合安装方法(java redis安装)
- Linux下Java命令的使用方法简介(linux下java命令)
- Java随机生成验证码(支持大小写字母、数字、随机字体)的实例
- Java遍历Properties所有元素的方法实例
- java正则表达式提取数字的方法实例
- Java之Thread的join方法实例
- JAVA流控及超流控后的延迟处理实例
- java实现文件读写与压缩实例