Java可变长参数列表详解
发布日期:2019-09-05 17:22:11点击次数:次
今天西安鸥鹏培训机构小编为大家介绍“Java可变长参数列表详解”,希望此文能够帮助到大家,下面就随小编一起看看Java可变长参数列表详解的内容吧。
Java中定义了变长参数,允许在调用方法时传入不定长度的参数。
Java可变长参数定义及调用
在定义方法时,在最后一个形参后加上三点…,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:
可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数
由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数
Java的可变参数,会被编译器转型为一个数组
变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立
publicvoidfoo(String...varargs){}
foo("arg1","arg2","arg3");
//上述过程和下面的调用是等价的
foo(newString[]{"arg1","arg2","arg3"});
例如,求任意个整数的乘积。
packageexercise;
publicclassproduct{
publicstaticintfunc(int...args){
intret=1;
for(inti:args)ret*=i;
returnret;
}
publicstaticvoidmain(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));
}
}
由于可变长参数就是被编译器转化为数组实现的,我们完全可以写成以数组做参数的形式:
packageexercise;
publicclassproduct{
publicstaticintfunc(int[]args){
intret=1;
for(inti:args)ret*=i;
returnret;
}
publicstaticvoidmain(String[]args){
System.out.println(func(newint[]{1,2,3}));
System.out.println(func(newint[]{2,2,2,2,2,2}));
System.out.println(func(newint[]{100,1000}));
}
}
方法重载
优先匹配固定参数
调用一个被重载的方法时,如果此调用既能够和固定参数的重载方法匹配,也能够与可变长参数的重载方法匹配,则选择固定参数的方法:
publicclassVarargs{
publicstaticvoidtest(String...args){
System.out.println("version1");
}
publicstaticvoidtest(Stringarg1,Stringarg2){
System.out.println("version2");
}
publicstaticvoidmain(String[]args){
test("a","b");//version2优先匹配固定参数的重载方法
test();//version1
}
}
匹配多个可变参数
调用一个被重载的方法时,如果此调用既能够和两个可变长参数的重载方法匹配,则编译出错:
publicclassVarargs{
publicstaticvoidtest(String...args){
System.out.println("version1");
}
publicstaticvoidtest(Stringarg1,String...arg2){
System.out.println("version2");
}
publicstaticvoidmain(String[]args){
test("a","b");//Compileerror
}
}