读Java编程艺术之笔记(可变参数)
Java语言在JDK1.5中首次推出可变参数,variable arguments,或简称varargs。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。
可变参数也不神秘。实际上,JVM将根据程序中调用这个方法是提供的参数数量,来装载和运行它。
可变参数的简单语法格式为:
methodName([argumentList], dataType...argumentName);
其中:
argumentList 普通参数,可选项;
dataType 数据类型或者类(将自动转换成dataType的数组);
... Java的操作符,表示0个到多个(注意是3点);
argumentName 参数名(可变参数必须在最后)
例如:
public static int sumInts(int...numbers) { int sum = 0; for (int num : numbers) { sum += num; } return sum; }
可变参数兼容数组类型参数,详细出处参考http://blog.csdn.net/justinavril/article/details/4674305
public class TestVarArgus { public static void dealArray(int... intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void dealArray(int[] intArray){//会有Duplicate method dealArray(int[]) in type TestVarArgus的错误 for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ dealArray(); dealArray(1); dealArray(1, 2, 3); } }
从上面这段代码可以看出,这两个方法是冲突的,是无法重载的。到这里,再来做一个有意思的实验:
public class TestVarArgus { public static void dealArray(int... intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ int[] intArray = {1, 2, 3}; dealArray(intArray); //通过编译,正常运行 } }
public class TestVarArgus { public static void dealArray(int[] intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ dealArray(1, 2, 3); //编译错误 } }
从上面这两段代码可以看出来,可变参数是兼容数组类参数的,但是数组类参数却无法兼容可变参数。其实对于第二段代码而言,编译器并不知道什么可变不可变,在它看来,需要定义一个dealArray(int, int, int)类的方法。所以,自然就无法去匹配数组类参数的dealArray方法了。