什么时候使用可变长参数?

Stack Overflow 上有个关于变长参数使用的问题。简单地说,
在不确定方法需要处理的对象的数量时可以使用可变长参数,会使得方法调用更简单,无需手动创建数组 new T[]{…}

原文地址:https://blog.csdn.net/qiuchengjia/article/details/52910888

如何定义和使用

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

  • 可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数
  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数
  • Java的可变参数,会被编译器转型为一个数组
  • 变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立

    1. public void foo(String...varargs){}
    2. foo("arg1", "arg2", "arg3");
    3. //上述过程和下面的调用是等价的
    4. foo(new String[]{"arg1", "arg2", "arg3"});

    可变参数的调用:

    1. public class Varargs {
    2. public static void test(String... args) {
    3. for(String arg : args) {
    4. System.out.println(arg);
    5. }
    6. }
    7. public static void main(String[] args) {
    8. test();//0个参数
    9. test("a");//1个参数
    10. test("a","b");//多个参数
    11. test(new String[] {"a", "b", "c"});//直接传递数组
    12. }
    13. }

    方法重载:优先匹配固定参数

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

    1. public class Varargs {
    2. public static void test(String... args) {
    3. System.out.println("version 1");
    4. }
    5. public static void test(String arg1, String arg2) {
    6. System.out.println("version 2");
    7. }
    8. public static void main(String[] args) {
    9. test("a","b");//version 2 优先匹配固定参数的重载方法
    10. test();//version 1
    11. }
    12. }