介绍
从Java 5开始,Java 语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟...
,其中...
位于变量类型和变量名之间,前后有无空格都可以。
可变参数是我们在方法定义时可以使用个数不确定的参数,让我们在使用时对于同一方法可以使用不同个数的参数。
可变参数是数组参数的语法简化,调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。
为什么要用可变参数呢?我们看下面的情况:当我们写一个求和的方法
public static void sum(int x, int y) {
System.out.println(x + y);
}
调用时
sum(99, 1);
如果想传 3 个参数就要进行方法的重载
public static void sum(int x, int y, int z) {
System.out.println(x + y + z);
}
如果要求更多数字的和还需要写新方法。这时候可变参数就派上用场了:
public static int sum(Integer... integers) {
int sum = 0;
for (Integer i : integers) {
sum += i;
}
return sum;
}
使用:
int total = sum(99, 1, 3, 7);
System.out.println("total:" + total);
运行结果:
total:110
使用注意
需要注意的是:
1、一个方法中的可变参数只能有一个,并且只能作为最后一个参数。当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项
2、如果我们有一个方法叫做test(String... strings)
,那么你还可以写方法test()
,但你不能写test(String[] strings)
,这样会出编译错误,系统提示出现重复的方法
3、在使用的时候,对于test(String...strings)
,你可以直接用test()
去调用,表示没有参数,也可以用test("aa", "bb")
或 test(new String[]{"aa", "bb"})
来传递多个参数
4、如果既有test(String... strings)
函数,又有test()
函数,我们在调用test()
时,会优先使用test()
函数。只有当没有test()
函数时,我们调用test()
,程序才会走test(String... strings)
举例
public class Main {
public static void main(String[] args) {
System.out.println(test("my", "name", "is", "Errol"));
System.out.println(test());
System.out.println(test(new String[]{"Hello", "World"}));
}
public static int sum(Integer... integers) {
int sum = 0;
for (Integer i : integers) {
sum += i;
}
return sum;
}
public static String test(String... strings) {
StringBuilder stringBuilder = new StringBuilder();
for (String s : strings) {
stringBuilder.append(s);
stringBuilder.append(" ");
}
return stringBuilder.toString();
}
public static String test() {
return "Hello World";
}
//不能写以下方法,会提示方法重复
/*public static String test(String[] strings){
StringBuilder stringBuilder = new StringBuilder();
for (int i=0;i<strings.length;i++){
stringBuilder.append(strings[i]);
stringBuilder.append(" ");
}
return stringBuilder.toString();
}*/
}
运行结果
my name is Errol
Hello World
Hello World
我们之前学过的集合之 Set、Collection用到的addAll就是一个可变长参数的方法
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}