形如:public void function(int arg, int... args)
可变参数隐式地创建一个数组
注意:可变参数必须出现在参数列表的最后,否则使用数组
分析以下程序:
public class VarParameter {
public static void main(String[] args) {
printArr(1, 2, 3);
printArr(new Integer[] { 1, 2, 3 });
printArr(new int[] { 1, 2, 3 });
printArr("1", "2", "3");
printArr(new String[] { "1", "2", "3" });
printArr(new Object[] { new String[] { "1", "2", "3" } });
printArr((Object) new String[] { "1", "2", "3" });
}
private static void printArr(Object... args) {
System.out.println(args.length);
}
}
输出结果为:
3
3
1
3
3
1
1
分析:
- 传递参数为1,2,3时,隐式地构造args = new Object[]{1, 2, 3};
- 传递参数为new Integer[]{1,2,3}时,隐式地将Integer[]转变为Object[]
- 传递参数为new int[]{1,2,3}时,将int[]转变为Object,因此Object数组的长度只有一(基本类型无法直接转变为Object)
- 传递参数为"1","2","3"时,隐式地构造args = new Object[]{"1", "2", "3"};
- 传递参数为new String[]{"1", "2", "3"}时,隐式地将String数组转变为Object数组
- 传递参数为new Object[] {new String[]{"1", "2", "3"}}时,将String数组作为Object数组的一个元素进行传递
- 传递参数为(Object)new String[]{"1", "2", "3"}时,强制地将String数组转变为Object类型(数组的Superclass为Object)
再分析一个:
import java.util.Arrays;
import java.util.List;
public class VarParameter {
public static void main(String[] args) {
List list = Arrays.asList(new int[]{1,2,3});
System.out.println(list.size());
}
}
同样的道理,本程序的输出结果也为1。