http://www.meichua.com (收藏,设为首页)
以前打牌的时候出牌太慢,其他人就叫着出啊,出啊,所以就变成了chua...... (手机请访问 http://3g.dlog.cn/meichua)

java特性-变参

2008年3月28日(Friday) 17点23分 作者: chua 天气: 心情: 一般

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

标签: java varargs 变参 
评论者: 虫虫 2008-4-27 12:01 (Sunday)

原创?

评论者: chua 2008-4-27 19:36 (Sunday)

是按照OReilly的《Java 1.5 Tiger, A Developer's Notebook》教程写的,我有英文电子版,想要么?留下邮箱

姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验