在Java SE 5.0之后,提供了可以用可变的参数数量调用的方法(有时成为“变参”方法)。
例如定义方法add
public void add(int... params) {
int result = 0;
for (int param : params) {
result += param;
}
}
Question 1:可变长参数和数组的区别?
看一段代码
public void add(int... params) {
int result = 0;
for (int param : params) {
result += param;
}
}
public void add(int[] params) {
int result = 0;
for (int param : params) {
result += param;
}
}
这两个同名函数看上去应该是参数不相同的,属于方法重载(重载,就是函数或者方法有同样的名称,但是参数列表不相同的情形),
但实际上,这段代码是无法通过编译的。编译器提示错误为:“Duplicate method add(…)”,说明这两个方法的参数是相同的。
究其原因,在Java中,可变长参数实际上就是数组的另一种形式,只不过是为了方便在调用方法时不需要创建数组。在编译过程中,编译器遇到 int… ,直接将其转换为 int[] ,因此对于编译器来说,这两个方法的参数是一模一样的,不属于重载,因此不能通过编译。
Question 2:可变长参数方法和固定参数方法的调用的优先级?
public static void print(String a,String b){
System.out.println("固定参数");
System.out.println(a);
System.out.println(b);
}
public static void print(String... strings){
System.out.println("可变长参数");
for(String str:strings)
System.out.println(str);
}
public static void main(String[] args){
print("123","456");
}
在上面这段代码的main函数中,调用了print()方法,但是在当前类中,同时有两个满足条件的方法,一个参数固定,一个参数为可变长。
运行结果为:
固定参数
123
456
这说明,当调用方法的时候,如果同时存在固定参数方法和可变长参数方法都满足条件的话,则优先调用固定参数方法。
Question 3:同时存在多个可变长参数方法匹配调用的时候,结果如何?
对Question2中代码稍作修改:
public static void print(String a,String... strings){
System.out.println(a);
for(String str:strings)
System.out.println(str);
}
public static void print(String... strings){
for(String str:strings)
System.out.println(str);
}
public static void main(String[] args){
print("123","456");
}
在上述代码中,同时存在两个可变长参数方法,而print(“123”,”456”)调用时同时满足这两个方法。
编译时发现,编译器提示:“The method print(String, String[]) is ambiguous”,编译器不知道该选哪个方法调用。
因此,同时存在两个可变长参数方法满足调用条件时,编译器无法通过编译。
Question 4:定义方法时可变长参数位置?以及可变长参数个数
public void print(String... strings, String str) {
System.out.println("可变长参数");
for (String str : strings)
System.out.println(str);
}
编译器提示:“the variable argument type String of the method print must be the last parameter”。
当方法有多个参数时,可变长参数必须位于最后。
同时,这也意味着,一个方法最多只能存在一个可变长参数。