可变参数
1. 使用目的
在 Java 中,类里面的方法如果不确定要传入某一个类型的参数的个数,可以使用可变参数传参。
public static void main(String[] args) {
printStr("1","2","3");
}
private static void printStr(String...strs){
for (String str : strs) {
System.err.println(str);
}
}
2.使用方法
- Java支持传递同类型的可变参数给一个方法
- 一个方法中只能指定一个可变参数
- 可变参数必须是方法的最后一个参数。任何普通的参数必须在它之前声明
返回值类型 方法名称(类型...参数名称){ // 在方法声明中,在指定参数类型后加一个省略号(...)
// 方法体
}
private static void printStr(int a, String...strs){
for (String str : strs) {
System.out.println(str);
}
}
调用含有可变参数的方法时:
- 可以不写参数,即传入空参;
- 可以直接在里边写入参数,参数间用逗号隔开;
- 可以传入一个数组
public static void main(String[] args) {
String[] strs = {"a","b","c"};
printStr();
printStr(strs);
printStr("1","2","3");
}
- 拥有可变参数的方法可以被重载,在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。
- 如果重载的两个方法中都出现了可变参数,并且在调用时会引起歧义,则报错。
private static void printStr(String...strs){
for (String str : strs) {
System.out.println(str);
}
}
private static void printStr(Integer i, String...strs){
for (String str : strs) {
System.out.println(str);
}
}
// 当 printStr("a","b","c"); 时,会与第一个printStr方法产生歧义
private static void printStr(String s, String...strs){
for (String str : strs) {
System.out.println(str);
}
}
- 可变参数可以兼容数组参数,但数组参数无法兼容可变参数。如果直接使用数组类型作为形参,那么在调用方法的传入的实参是需要固定长度的,而使用可变参数则没有这个问题
// printStr(array) 可以
private static void printStr(String...strs){
for (String str : strs) {
System.out.println(str);
}
}
// 两个方法在调用时,会产生歧义
// printStr("a","b","c") 不可以
private static void printStr(String[] strs){
for (String str : strs) {
System.out.println(str);
}
}
3.使用规范
-
避免将带有可变参数的方法进行重载,即便可以这样做。
-
尽量避免传递空值。
-
重写含可变参数的方法时,参数不能变,要遵守重写的规范。
1. 重写方法不能缩小访问权限; 2. 参数列表必须与被重写方法相同(包括显示形式); 3. 返回类型必须与被重写方法的相同或是其子类; 4. 重写方法不能抛出新的异常,或者超过了父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。