java特性-变参
4 varargs 变参
4.1 Creating a Variable-Length Argument List
看一下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | public static void main(String[] args) { System.out.println(sum(1)); System.out.println(sum(1,2,3,4,5,6,7)); } public static int sum(int sum1,int...sum2) { int total = 0; total += sum1; for(int sum :sum2) { total += sum; } return total; } |
反编译class后看到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public static void main(String args[]) { System.out.println(sum(1, new int[0])); System.out.println(sum(1, new int[] { 2, 3, 4, 5, 6, 7 })); } public static transient int sum(int sum1, int sum2[]) { int total = 0; total += sum1; int ai[]; int j = (ai = sum2).length; for(int i = 0; i < j; i++) { int sum = ai[i]; total += sum; } return total; } |
从上我们可以看出,定义的变参在编译后变成了一个int的数组,调用的参数也被封装成数组
另外变参只能在方法的最后一个参数上定义
假如上面的例子中加一个方法
1 2 3 4 5 6 7 | public static int sum(int...sums) { int total = 0; for(int sum :sums) { total += sum; } return total; } |
这个时候ide报错了,因为在main方法里调用sum的时候,不知道该调用哪个了,因为两个都适用
4.2 Allowing Zero-Length Argument Lists
看一下代码
1 2 3 4 5 6 7 8 9 10 11 | public static void main(String[] args) { System.out.println(sum()); } public static int sum(int...sums) { int total = 0; for(int sum :sums) { total += sum; } return total; } |
在这个例子里运行是没有问题的,但是在有些情况下你还是要对变参参数做检查的
4.3 Specify Object Arguments Over Primitives
我们知道在java中所有的class都继承自Object,原始类型也能autoboxing成wrapper type,所以可以定义个打印的方法
1 2 3 4 5 6 7 | public static void print(Object... values) { StringBuilder sb = new StringBuilder(); for (Object o : values) { sb.append(o).append(" "); } System.out.println(sb.toString()); } |
这样就可以打印所有的
4.4 Avoiding Automatic Array Conversion
PrintStream.java中有个方法
PrintStream printf(String format, Object… args)
看一下调用
System.out.printf(“The balance of %s’s account is $%(,6.2f\n”,”chua”, 2000.0);
输出是:The balance of chua’s account is $2,000.00
实际上此方法是
PrintStream printf(String format, Object[] args)
看一下调用
String[] strings = new String[] {“Hello”, “to”, “all”, “of”, “you”};
System.out.printf(“Description of object array: %s\n”,strings);
输出是:Description of object array: Hello
在这里我们想要输出的并不是”Description of object array: Hello”,但是compiler认为Strings就是哪个Object[]args,而没有在外边加一层array的封装,所以这个只有你自己完成了
System.out.printf(“Description of object array: %s\n”,new Object[]{strings});
输出:Description of object array: [Ljava.lang.String;@83cc67