关于java的可变参数列表
1.简介:
java的可变参数列表是的从jdk1.5开始新增的,其英文名词varargs
参看:New Features and Enhancements J2SE 5.0
2.作用
可以传未知个数的参数,无需手动将参数列表装入数组
参看:Varargs
3.语法
//可变参数列表的varname被编译后其实是一个数组来的
anymethod(typename ... varname){}
4.简单例子
可以传很多个参数,也可以不传参数。某种意义上说还可以减少方法的重载。
public class Test {
public static void varArgs(int ... numbers){
//numbers其实是数组,它有length属性,numbers.length可以获取它的参数个数;可以用下标访问值,比如number[0],当然这是要number.lenth>0时候才可以访问的。
for(int s: numbers){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
varArgs();
varArgs(1,2);
varArgs(1,2,3,4,5,6);
}
}
输出结果是:
1,2,
1,2,3,4,5,6,
这种写法挺酷的。当然用数组也可以实现,不过会多几个步骤,需要方法重载无参数的情况,另外使用的时候也需要创建一个数组,会比可变参数列表的写法多些代码。
代码如下:
public class Test {
public static void varArgs(){
System.out.println();
}
public static void varArgs(int[]numbers){
for(int s: numbers){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
varArgs();
varArgs(new int[]{1,2});
varArgs(new int[]{1,2,3,4,5,6});
}
}
显然,可变参数列表的写法舒服、简洁些,看起来也高级些。
5.注意事项
//1.可变参数列表一定是在最后的
public void test(int ... num,double n)//是错误的
public void test(double n,int ... num)//是正确的
//2.每个方法最多只有一个可变参数列表
6.结合泛化
有时候我们使用泛化还可以让参数变得更加灵活些,让参数类型有更多选择。
比如
public class Test {
public static void varArgs(E ... arg){
for(E s: arg){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
varArgs(11.1,2.3,0.4);
varArgs(1,2,3,4,5,6);
varArgs("hi","hello");
}
}
输出
11.1,2.3,0.4,
1,2,3,4,5,6,
hi,hello,
注意在这里,如果要像之前那样用数组改写会有所不同,在可变参数列表中这里的泛化的每个参数不一定需要统一类型,如下面的
public class Test {
public static void varArgs(E ... arg){
for(E s: arg){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
//下面的调用时是可运行的
varArgs("hi",1,new double[]{});
}
}
其实,上面的泛化相当于参数就是Object类型
public class Test {
public static void varArgs(Object ... arg){
for(Object s: arg){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
//下面的调用时是可运行的
varArgs("hi",1,new double[]{});
}
}
7.典型的应用
比如java的System.out.printf()方法
//前面的第一个参数是格式字符串,后面的参数就是可变参数列表
System.out.printf("%s,%d/%d/%d","cendeal",2019,3,17);
下面是其源码定义
//System是java的类,out是System类的类成员,out是PrintStream对象,printf()是PrintStream的成员方法,所以访问就是System.out.printf()
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable
{
//此处省略该类其他代码
public PrintStream printf(String format, Object ... args) {
return format(format, args);
}
}