原理
Java可变长参数列表的实现是通过编译器把把这些参数封装成一个数组来传递的。
注意点
可变成参数列表不能与同类型数组重载,因为它本身就是数组
void print(int... args) { }
//Error : Duplicate method print
void print(int[] args) { }
可变成参数类型不能与自动装箱后类型相同的方法重载
void print(int... args) { }
void print(Integer[] args) { }
void test() {
//Error : The method print(int[]) is ambiguous for the type
print(1, 2, 3);
}
可变长参数列表只能放在方法参数列表的最后
void print(int firstArg, int... args) { }
//Error : The variable argument type int of the method print must be the last parameter
void print(int... args, String str) { }
参数数量不确定。可以传多个,也可以一个都不传,也可以传null
/*
* 该方法可以用Arrays.toString(T[] args)来代替。
*/
static void print(int... args) {
if(args == null) {
System.out.println("args = null");
return;
}
StringBuilder sb = new StringBuilder();
sb.append("len = ");
sb.append(args.length);
sb.append("{ ");
for(int i=0;i<args.length;i++) {
sb.append(args[i]);
if(i != args.length-1) {
sb.append(", ");
}
}
sb.append(" }");
System.out.println(sb.toString());
}
public static void main(String[] args) {
print(1, 2, 3);
print();//相当于传递一个长度为零的数组
print(null);
}
输出
len = 3{ 1, 2, 3 }
len = 0{ }
args = null
传递变长参数列表和直接传递变长参数类型的数组结果是一样的
static void print(int... args) {
if(args == null) {
System.out.println("args = null");
return;
}
StringBuilder sb = new StringBuilder();
sb.append("len = ");
sb.append(args.length);
sb.append("{ ");
for(int i=0;i<args.length;i++) {
sb.append(args[i]);
if(i != args.length-1) {
sb.append(", ");
}
}
sb.append(" }");
System.out.println(sb.toString());
}
public static void main(String[] args) {
print(1, 2, 3);//经过编译器改造也会把它变为数组类型
print(new int[] {1, 2, 3});
}
输出
len = 3{ 1, 2, 3 }
len = 3{ 1, 2, 3 }