美文网首页Java 杂谈
java的可变参数列表

java的可变参数列表

作者: CENDEAL | 来源:发表于2019-03-17 14:48 被阅读10次

    关于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 <E>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 <E>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的可变参数列表

        本文链接:https://www.haomeiwen.com/subject/wqkymqtx.html