Java中如何定义带变量参数列表的方法

时间:2019-04-29 03:17:57  来源:igfitidea点击:

从Java5.0开始,我们可以用变量参数列表(var args)定义方法,这些方法可以在我们不知道确切参数数量的情况下使用。

为了理解var args方法,让我们假设我们要实现两个数字加法的方法。方法如下:

public class Main {

  public static void main(String[] args) {

      int v1 = 10, v2 = 20;

      System.out.println("和是: "+doAdd(v1, v2));

  }

  public static int doAdd(int vb1, int vb2)

  {

      return vb1+vb2;

  }

}

如果情况发生变化,我需要一个方法来计算3个数字的和,我将这样定义它

public class Main {

  public static void main(String[] args) {

      int v1 = 10, v2 = 20, v3 = 30;

      System.out.println("和是: "+doAdd3(v1, v2, v3));

  }

  public static int doAdd3(int vb1, int vb2, int vb3)

  {

      return vb1+vb2+vb3;

  }

}

这种情况可以继续下去, 要算4个,5个数字之和。

因此,为了提高效率,我们需要一个可以求任意个数字的和的方法——一个带有变量参数列表的方法。

定义var args方法的语法

[access modifiers][non-access modifiers] return_type functionName(type param1, type param2,   type … parametersList  )

其中:

param1/param2–方法的输入参数;这些参数是可选的;

parametersList–存储变量参数列表的数组;所有参数都具有相同的类型(基元数据类型或引用);var args参数在末尾声明;

通过使用var args方法,前面的问题就有了解决方案:

public static int doAdd(int ... values)

  {

      int sum = 0;

      for(int i=0;i < values.length;i++)

          sum+=values[i];

      return sum;

  }

我们可以这样调用方法:

public class Main {

  public static void main(String[] args) {

      int v1 = 10, v2 = 20, v3 = 30;

      System.out.println("前面两个值的和是: "+doAdd(v1, v2));

      System.out.println("所有值的和是: "+doAdd(v1, v2, v3));

      System.out.println("空值的和: "+doAdd());

  }

}

var args方法还可以有其他输入参数,但它们必须在var arg参数之前定义。

比如:计算正/负数的值

public static int doConditionalAdd(boolean flag, int ... values)

  {

      int sum = 0;

      for(int i=0;i < values.length;i++)

      {

          if(flag && values[i] >= 0)

              sum+=values[i];

          if(!flag && values[i] < 0)

              sum+=values[i];

      }

      return sum;

  }

var args方法的另一种选择是使用数组作为输入参数。区别在于,必须定义数组,并且必须在调用方法之前复制变量值:

public class Main {

  public static void main(String[] args) {

      int v1 = 10, v2 = 20, v3 = 30;

      int[] array = new int[3];

      array[0] = v1;

      array[1] = v2;

      array[2] = v3;

	//an alternative is int[] array = {v1,v2,v3};

      System.out.println("The sum of all values is "+doAdd(array));

  }

  public static int doAdd(int[] values)

  {

      int sum = 0;

      for(int i=0;i < values.length;i++)

          sum+=values[i];

      return sum;

  }

}

var-args方法的规则

  • var arg列表中的所有参数都具有相同的类型(基元类型或引用);

  • 方法可以有其他参数;

  • 一个方法只能有一个var arg列表;

  • var arg 类别必须是方法签名中的最后一个参数;

根据前面的规则,下面的声明是非法的:

// 语法错误

  public static int doAdd(int values ... )

  {   }

  //var-arg 不是最后一个参数

  public static int doAdd(int... values, boolean flag )

  {   }

  //多个 var-arg 参数

  public static int doAdd(int... values1, int... values2 )

  {   }