Java可变参数(varargs)是在Java 1.5中引入的。Java可变参数也称为java变量参数。

java中的可变参数使方法能够接受可变数量的参数。在方法签名中使用三个点(...)也称为省略号,以使其接受变量参数。例如 -

public static int sum(int i, int...js ){
//do something
}

关于java中可变参数的要点 -

在方法中只能有一个可变参数。

只有方法的最后一个参数可以是可变参数。

根据java文档,不应该重载可变参数方法。

java可变参数如何工作?

当调用带有变量参数的方法时,java编译器会从左到右匹配参数。当到达最后一个可变参数参数,它就会创建一个剩余参数的数组并将其传递给方法。实际上,可变参数参数的行为类似于指定类型的数组。

// 带有可变参数的方法
public static int sum(int i, int...js ){
int sum = i;
for(int x : js){
sum+=x;
}
return sum;
}
// 使用数组作为参数与可变参数的实现相同
public static int sumArray(int i, int[] js ){
int sum = i;
for(int x : js){
sum+=x;
}
return sum;
}

可以查到sum和sumArray方法的实现主体完全相同。所以应该在API提供时使用可变参数,例如java.io.PrintStream.printf()方法,但是不应该把它作为数组的替代品。

为什么不应该重载可变参数方法?

下面来看一个例子,以了解为什么重载java可变参数方法不是一个好主意。

package com.journaldev.misc;
public class VarargsExample {
public static void main(String[] args) {
System.out.println(sum(1));
System.out.println(sum(1,2)); //编译错误,模糊方法
}
public static int sum(int i, int...js ){
System.out.println("sum1 called");
int sum = i;
for(int x : js){
sum+=x;
}
return sum;
}
public static int sum(int i, int k, Object...js ){
System.out.println("sum2 called");
int sum = i+k;
for(Object x : js){
sum+=1;
}
return sum;
}
}

在上面的示例中,注意到当使用可变参数重载方法时,编译器不会报错。但是当尝试使用它时,编译器会混淆在映射第二个参数时使用哪种方法。

如果只有一个参数,编译器很聪明地使用第一个方法,因为它可以使用最少一个参数,但第二个方法至少需要两个参数。