java的可变参数列表

关于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);
    }
}

你可能感兴趣的:(java的可变参数列表)