Java 可变长参数列表

时间:2019-03-18
本文章向大家介绍Java 可变长参数列表,主要包括Java 可变长参数列表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java中定义了变长参数,允许在调用方法时传入不定长度的参数。

定义及调用

在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:

  • 可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数

  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数

  • Java的可变参数,会被编译器转型为一个数组

  • 变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立

public void foo(String...varargs){}

foo("arg1", "arg2", "arg3");

//上述过程和下面的调用是等价的
foo(new String[]{"arg1", "arg2", "arg3"});

例如,求任意个整数的乘积。

package exercise;

public class product {
    public static int func(int... args){
        int ret = 1;
        for(int i:args)  ret *= i;
        return ret;
    }
    public static void main(String[] args){
        System.out.println(func(1,2,3));
        System.out.println(func(2,2,2,2,2,2));
        System.out.println(func(100,1000));
    }
}

由于可变长参数就是被编译器转化为数组实现的,我们完全可以写成以数组做参数的形式:

package exercise;

public class product {
    public static int func(int[] args){
        int ret = 1;
        for(int i:args)  ret *= i;
        return ret;
    }
    public static void main(String[] args){
        System.out.println(func(new int[]{1,2,3}));
        System.out.println(func(new int[]{2,2,2,2,2,2}));
        System.out.println(func(new int[]{100,1000}));
    }
}

方法重载

优先匹配固定参数

调用一个被重载的方法时,如果此调用既能够和固定参数的重载方法匹配,也能够与可变长参数的重载方法匹配,则选择固定参数的方法:

public class Varargs {

    public static void test(String... args) {
        System.out.println("version 1");
    }

    public static void test(String arg1, String arg2) {
        System.out.println("version 2");
    }
    public static void main(String[] args) {
        test("a","b");     //version 2 优先匹配固定参数的重载方法
                test();    //version 1
    }
}

匹配多个可变参数

调用一个被重载的方法时,如果此调用既能够和两个可变长参数的重载方法匹配,则编译出错:

public class Varargs {

    public static void test(String... args) {
        System.out.println("version 1");
    }

    public static void test(String arg1, String... arg2) {
        System.out.println("version 2");
    }
    public static void main(String[] args) {
        test("a","b");  //Compile error
    }
}

参考链接:http://www.runoob.com/w3cnote/java-varargs-parameter.html