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

