Java 可变长参数列表

时间:2022-03-27 20:42:06

Java中定义了变长参数,允许在调用方法时传入不定长度的参数。

定义及调用

在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:

  • 可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数

  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数

  • Java的可变参数,会被编译器转型为一个数组

  • 变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立

public void foo(String...varargs){}

foo("arg1", "arg2", "arg3");

//上述过程和下面的调用是等价的
foo(new String[]{"arg1", "arg2", "arg3"});

例如,求任意个整数的乘积。

package exercise;

public class product {
public static int func(int... args){
int ret = 1;
for(int i:args) ret *= i;
return ret;
}
public static void main(String[] args){
System.out.println(func(1,2,3));
System.out.println(func(2,2,2,2,2,2));
System.out.println(func(100,1000));
}
}

由于可变长参数就是被编译器转化为数组实现的,我们完全可以写成以数组做参数的形式:

package exercise;

public class product {
public static int func(int[] args){
int ret = 1;
for(int i:args) ret *= i;
return ret;
}
public static void main(String[] args){
System.out.println(func(new int[]{1,2,3}));
System.out.println(func(new int[]{2,2,2,2,2,2}));
System.out.println(func(new int[]{100,1000}));
}
}

方法重载

优先匹配固定参数

调用一个被重载的方法时,如果此调用既能够和固定参数的重载方法匹配,也能够与可变长参数的重载方法匹配,则选择固定参数的方法:

public class Varargs {

    public static void test(String... args) {
System.out.println("version 1");
} public static void test(String arg1, String arg2) {
System.out.println("version 2");
}
public static void main(String[] args) {
test("a","b"); //version 2 优先匹配固定参数的重载方法
test(); //version 1
}
}

匹配多个可变参数

调用一个被重载的方法时,如果此调用既能够和两个可变长参数的重载方法匹配,则编译出错:

public class Varargs {

    public static void test(String... args) {
System.out.println("version 1");
} public static void test(String arg1, String... arg2) {
System.out.println("version 2");
}
public static void main(String[] args) {
test("a","b"); //Compile error
}
}

参考链接:http://www.runoob.com/w3cnote/java-varargs-parameter.html