Java可变参数
在java方法定义是可以使用个数不确定的参数,对于同一个方法可以用不同个数的参数调用。
1. 定义方法
…表示可变参数
在有可变参数的方法中可以把参数当做数组使用。1
2
3
4
5
6
7//循环输出所有参数值
print(String... args){
for(String temp:args){
System.out.println(temp);
}
}
//补充:这里temp为String,args为对象
实际上,变长参数会被转型为一个数组传入方法体。1
2
3
4
5public void foo(String...varargs){}
foo("arg1", "arg2", "arg3");
//上述过程和下面的调用是等价的
foo(new String[]{"arg1", "arg2", "arg3"});
2. 调用
可变长参数方法调用
- 既可以不带参数,也可以带多个参数。
- 在调用带有可变参数的方法时,JVM优先调用固定参数的方法
- 若要调用的方法可以和两个可变参数匹配,则编译出现错误,因为JVM不知道该调用哪一个方法
3. 一个方法只能带一个可变参数,且必须作为其参数表的最后一个参数
注:
- 避免带有可变长参数的方法重载,编译器虽然知道怎么调用,但人容易陷入调用的陷阱及误区
- 别让null值和空值威胁到变长方法。为了说明null值的调用,重新给出一个例子:两个方法都匹配,所以编译不通过。同时还有个非常不好的编码习惯,即调用者隐藏了实参类型,这是非常危险的,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。故应在调用前加:
1
2
3
4
5
6
7
8
9
10public class VarArgsTest {
public void print(String test, Integer... is) {}
public void print(String test,String...args ) {}
public static void main(String[] args) {
VarArgsTest1 test = new VarArgsTest();
test.print("hello"); //编译不通过
test.print("hello", null); //编译不通过
}
}1
String[] strs = null;
这里边要注意的主要是方法覆写的要点1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class VarArgsTest {
public static void main(String[] args) {
Base base = new Son();
base.print("hello");
Son son = new Son();
son.print("hello"); //编译不通过
}
}
class Base {
void print(String... args) {
System.out.println("Base");
}
}
class Son extends Base {
void print(String[] args) {
System.out.println("Son");
}
}
- 重写方法不能降低访问权限;
- 参数列表必须与被重写方法相同(包括显示形式);
- 返回类型必须与被重写方法的相同或是其子类;
- 重写方法不能抛出新的异常,或者超过了父类范围的异常,只可以抛出更少、更有限的异常,或者不抛出异常。
一个需要注意的问题
1 | public class VarArgsTest { |
参考文章:Java中可变长参数的使用及注意事项