📜  Java中的可变参数(Varargs)

📅  最后修改于: 2020-03-30 12:37:53             🧑  作者: Mango

在JDK 5中,Java包含了一项功能,该功能简化了需要采用可变数量参数的方法的创建。此功能称为varargs,它是可变长度参数的缩写。带有可变数量参数的方法是varargs方法。
在JDK 5之前,可变长度参数可以通过两种方式处理。一个使用重载方法(每个使用一个重载),另一个使用参数重载到数组中,然后将此数组传递给方法。它们都可能容易出错,并且需要更多代码。varargs功能提供了更简单,更好的选择。
varargs的语法:
可变长度参数由三个句点(…)指定。例如,

public static void fun(int ... a)
{
   // 方法体
}

该语法告诉编译器可以使用零个或多个参数来调用fun()。结果,这里a被隐式声明为int []类型的数组。以下是用于说明上述概念的代码段:

// Java说明varargs的概念
class Test1
{
    // 方法接收int
    static void fun(int ...a)
    {
        System.out.println("参数量: " + a.length);
        // 使用for each,打印a的愿随
        for (int i: a)
            System.out.print(i + " ");
        System.out.println();
    }
    // 测试代码
    public static void main(String args[])
    {
        // 调用varargs方法 
        // 使用不同参数量
        fun(100);         // 一个参数
        fun(1, 2, 3, 4);  // 四个参数
        fun();            // 无参数
    }
}

输出:

参数量: 1
100
参数量: 4
1 2 3 4
参数量: 0

以上程序说明:

      • …语法告诉编译器已使用了varargs,这些参数应存储在a引用数组中
      • 变量a作为数组,在这种情况下,我们将a的数据类型定义为int。因此,它只能采用整数值。可以使用a.length来找到参数的数量,这是我们在Java中找到数组长度的方式。

注意:一种方法也可以具有可变长度的参数以及其他参数,但是应该确保在方法声明的参数列表中仅存在一个应该最后写入的varargs参数。

int nums(int a, float b, double … c)

在这种情况下,前两个参数与前两个参数匹配,其余参数属于c。

// Java展示varargs和常规参数混合使用
class Test2
{
    // 使用string作为参数,紧随varargs之后
    static void fun2(String str, int ...a)
    {
        System.out.println("字符串: " + str);
        System.out.println("参数数量: "+ a.length);
        // 使用for each展示每个参数
        for (int i: a)
            System.out.print(i + " ");
        System.out.println();
    }
    public static void main(String args[])
    {
        // 调用fun2()
        fun2("芒果文档", 100, 200);
        fun2("CSPortal", 1, 2, 3, 4, 5);
        fun2("for芒果");
    }
}

 

String: 芒果文档
参数数量: 2
100 200
String: CSportal
参数数量: 5
1 2 3 4 5
String: for芒果
参数数量: 0

重要事项:

      • Vararg方法也可以重载,但重载可能导致歧义。
      • 在JDK 5之前,可变长度参数可以用两种方法处理:一种方法是使用重载,另一种方法是使用数组参数。
      • 一个方法中只能有一个变量参数。
      • 可变参数(varargs)必须是最后一个参数。

错误的变量参数

    • 在单个方法中指定两个varargs:
      void method(String... gfg, int... q)
      {
          // 编译错误,因为有两个varargs
      }
      
    • 将varargs指定为method的第一个参数,而不是最后一个参数:
      void method(int... gfg, String q)
      {
          // 编译错误因为vararg在常规参数出现之前
      }