先讲可变参数。

上代码:

public class Test {
    public static void main(String[] args) {
        cc();
    }
    public static void cc(int... a) { // 形参可变的数组
        System.out.println(a.length);
        for (int i : a) {
            System.out.println(i);
        }
    }
}

运行结果:0

批注:形参个数可变的参数本质就是一个数组参数。但是和数组参数又有不同。

第一种:public static void cc(int... a)大致等于

第二种:public static void cc(int[] a)

不同点在哪里?

如果形参是数组类型int[] a,那么必须传入参数,不能cc(),否则编译错误。

但是用int... a,这个参数可以不填,切记!不传入参数时数组a不是null,数组a是一个长度为0的int数组。除非显式传入null参数。

 

形参是数组类型int[] a,必须要传入标准的数组形式的参数,比如

定义方法:public static void cc(int[] a) {...}

那么传入的时候cc(new int[]{ 1, 67, 32, 8, 9 }); 

定义方法:public static void cc(int... a) {...}

那么传入的时候可以cc(1, 5, 8);

表示数组a有3个元素,分别为1,5,8

也可以传入cc();数组a长度为0

eg:

public class Test {
    public static void main(String[] args) {
        cc(1, 3, 5);
        System.out.println();
        dd(new int[] { 2, 4, 6 });
    }

    public static void cc(int... a) { // 形参可变的数组
        for (int i : a) {
            System.out.print(i);
        }
    }

    public static void dd(int[] a) { // 形参可变的数组
        for (int i : a) {
            System.out.print(i);
        }
    }
}

运行结果:

135

246

 

 

接下来讲foreach循环问题

public class Test {
    public static void main(String[] args) {
        cc();
        dd(null);
    }
    public static void cc(int... a) { // 形参可变的数组
        System.out.println(a.length);
        for (int i : a) {
            System.out.println(i);
        }
    }
    public static void dd(int... a) { // 形参可变的数组
        for (int i : a) {
            System.out.println(i);
        }
    }
}

运行结果:

可以看到,不传入参数,数组a是一个长度为0的数组,foreach循环条件不满足,所以不打印

显式传入null,foreach循环会报空指针异常。所以使用foreach循环的时候一定要考虑集合或者数组的引用是否为null,以免发生空指针异常。

同理,形参为数组类型传入null,进入foreach也会报空指针异常

public class Test {
    public static void main(String[] args) {
        cc(null);
    }
    public static void cc(int[] a) { // 形参可变的数组
        for (int i : a) {
            System.out.print(i);
        }
    }
}

结果:

 

=================================Talk is cheap, show me the code===============================