Archive

Posts Tagged ‘varargs’

java特性-变参

March 28th, 2008 No comments

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

Categories: technic Tags: , ,