如果我们定义一个方法需要接受多个参数,并且多个参数的类型一致,传统的做法是定义一个数组作为方法的形参,例如这样:
public static int sum(int[] arr)
调用方法的时候我们又需要自己把数据封装到一个数组中传递
int res = sum(new int[]{1,2,3});
然而从 JDK 1.5 之后,出现了简化操作,我们可以在方法定义可变参数,例如这样:
public static int sum(int...arr)
调用的时候可以直接传递多个参数,而不用封装到数组中。
int res = sum(1,2,3);
它和传统做法完全是等价的。编译成class文件时,方法中传递过来的多个参数会先被封装到一个数组中,再进行传递。
下面是一个Demo:
import com.sun.istack.internal.NotNull;
public class Demo {
public static void main(String[] args) {
System.out.println(sum(1,2,3,5));
}
//arr是数组名,我们可以通过指定索引的方式访问其元素
public static int sum(@NotNull int... arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}
细节:
- 如果希望方法的参数列表中既有可变参数还有普通的形参,那么可变参数就必须放在最后。
public static int sum(double a,int...arr)
正确写法
public static int sum(int...arr,double a)
错误写法 - 无法在同一方法上定义多个可变参数。
- 可变参数的类型定义为Object,方法将最大程度通用化。
public class Demo {
public static void main(String[] args) {
printObject("小明", 1, 2.0, false, 'a');
}
public static void printObject(Object... arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}