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 ) { }