1、可变的参数类型,也称为不定参数类型。英文缩写是varargus,还原一下就是variable argument type。通过它的名字可以很直接地看出来,这个方法在接收实参的时候,个数是不定的,好像是来多少接多少,不来也可以。

public class VarargusDemo1 {
public static void test1(int a,int ...args){
System.out.println(a);
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
public static void main(String[] args) {
test1(1,2,3,4,5);
test1(1,2);
test1(1);
}
}
输出结果:
A12
B123
C



根据结果可知

 ①编译的时候,将可变参数当着一个数组来处理。

 ②调用执行时,根据传递参数的个数,实例化对应的数组。


2、从1可知,可变参数就好像在参数里面增加了一个数组,那么test(int arr[])和 test(int ... arr)有什么区别呢。

①test(int arr[])和 test(int ... arr) 是无法重载的:这说明编译期,

这两个方法的参数是一样的,可以证实可变参数编译时,把可变参数当成一个数组了。

public class VarargusDemo2 {
public static void test(int []arr){
}
//Duplicate method test(int...) in type VarargusDemo2
public static void test(int ...arr){
}
public static void main(String[] args) {
}
}

public class VarargusDemo2 {
public static void test(int... arr) {
for (int i : arr) {
System.out.print(i);
}
System.out.println();
}
public static void main(String[] args) {
test(1, 2, 3);
int[] arr = { 10, 20, 30 };
test(arr);
}
}
//运行正常,输出 
123
102030
public class VarargusDemo2 {
public static void test(int []arr){
for(int i:arr){
System.out.print(i);
}
}
public static void main(String[] args) {
/*
 * The method test(int[]) in the type VarargusDemo2 is not applicable for the 
            arguments (int, int, int)
 */
test(1,2,3);
}
}
//编译报错,大意是参数不匹配,这很明显(int,int,int)和 int[]arr)不匹配,



②上面可变参数的,却运行很正常,既可以接收一个数组,也可以接收一个可变的实参列表,这说明可变参数是兼容数组的

3,可变参数类型必须作为参数列表的最后一项,而不能放在其他参数类型的前面。

The variable argument type int of the method test1 must be the last parameter。假设可以把可变参数放在其他参数的前面,那么调用的时候就会参数不确定性,比如test1("B", 1, 2, 3)里面的 3到底是传给arr,还是传给a变量?可变参数必须作为最后一项,也许只是设计者的一种规定,其实也并没有什么道理可讲。假设我们不按照规则来,可以设置多个可变参数,如test(int...arr1,int arr2),那么对于调用者

test(1,2,3,4,5),JVM不就疯了吗,怎么把这些数分给这2个数组?


public class VarargusDemo3 {
/*
 * The variable argument type int of the method test1 must be the last parameter
 */
public static void test1(String a, int... args,int a) {
System.out.print(a);
for (int i:args){
System.out.print(i);
}
System.out.println();
}
public static void main(String[] args) {
/*The method test1(String, int[], Object) in the type VarargusDemo3 is not 
 applicable for the arguments (String, int, int)
 */
test1("A", 1, 2);
test1("B", 1, 2, 3);
}
}




4、可变参数与定长参数,哪一个优先级搞。

为什么test(1,3)调用定长参数,不调用可变参数。定长形参和实参完全一致,而可变参数的实参是包含于可变形参的,这就涉及到一个匹配度的问题了。就像我们经常说的,找到最适合自己的,而不是找到更好的。


public class VarargusDemo2 {
public static void test(int... arr) {
System.out.print("可变参数:");
for (int i : arr) {
System.out.print(i);
}
System.out.println();
}
public static void test(int a,int b) {
System.out.println("定长参数"+a+""+b);
}
public static void main(String[] args) {
test(1,3);
test(1,3,5);
}
}
结果:
定长参数13
可变参数:135