4 varargs 变参
4.1 Creating a Variable-Length Argument List
看一下代码
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后看到
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的数组,调用的参数也被封装成数组
另外变参只能在方法的最后一个参数上定义
假如上面的例子中加一个方法
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
看一下代码
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,所以可以定义个打印的方法
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
心情: 一般