zoukankan      html  css  js  c++  java
  • 可变参数列表-Java SE5新特性

    1.可变参数列表的简单实现
    当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。在以前的Java代码中,可以使用Object数组来实现这样的功能。因为,所有的类都是直接或间接继承于Object类。
     
    VarArgs.java
    package sample;
     
    class A1{}
     
    public class VarArgs {
           static void printArray(Object[] args){
                  for(Object obj:args)
                         System.out.print(obj+" ");
                  System.out.println();
           }
     
           public static void main(String[] args){
                  printArray(new Object[]{
                         new Integer(47),new Float(3.14),new Double(11.11) 
                  });
                  printArray(new Object[]{"one","two","three"});
                  printArray(new Object[]{new A1(),new A1(),new A1()});
           }
    }
     
    结果:
    47 3.14 11.11
    one two three
    sample.A1@a90653 sample.A1@de6ced sample.A1@c17164
     
    这里printArray方法使用Object数组作为参数,并使用foreach语法遍历数组,打印每个对象。
     
    2.Java SE5实现可变参数列表
    同样的方法,参数可以这样定义,(Object…args),这样达到同样的效果。
     
    NewVarArgs.java
    package sample;
     
    class A{}
     
    public class NewVarArgs {
           static void printArray(Object...args){
                  for(Object obj:args)
                         System.out.print(obj+" ");
                  System.out.println();
           }
     
           public static void main(String[] args){
                  printArray(new Integer(47),new Float(3.14),new Double(11.11));
                  printArray(47,
                  printArray("one","two","three");
                  printArray(new A(),new A(),new A());
                  printArray((Object[])new Integer[]{1,2,3,4});
                  printArray();
           }
    }
     
    结果:
    47 3.14 11.11
    47 3.14 11.11
    one two three
    sample.A@a90653 sample.A@de6ced sample.A@c17164
    1 2 3 4
     
    这里没有显式的使用数组作为参数,但编译器实际上会为你填充数组。所以同样可以使用foreach语法来遍历之。
    注意倒数第二行,编译器已经发现它是一个数组,所以不会在其上执行任何转换。最后一行表明,可以传递零个参数。
    也可以指定所有可变参数的类型,下面的程序指定所有可变参数都必须是String。
     
    OptionalArguments.java
    package sample;
     
    public class OptionalArguments {
           static void f(String...trailing){
                  for(String s:trailing)
                         System.out.print(s+" ");
                  System.out.println();
           }
     
           public static void main(String[] args){
                  f("one");
                  f("two","three");
                  f();
           }
    }
     
    结果:
    one
    two three
     
    可以在可变参数列表中同时使用原始类型与包装类。
     
    AutoboxingVarargs.java
    package sample;
     
    public class AutoboxingVarargs {
           public static void f(Integer...args){
                  for(Integer i:args)
                         System.out.print(i+" ");
                  System.out.println();
           }
     
           public static void main(String[] args){
                  f(new Integer(1),new Integer(2));
                  f(3,4,5,6,7,8,9);
                  f(10,new Integer(11),12);
           }
    }
     
    结果:
    1 2
    3 4 5 6 7 8 9
    10 11 12
     
    3.可变参数列表的重载(Overloading)
    如果出现重载的情况,则编译器会自动调用最适合的方法匹配之。
     
    OverloadingVarargs.java
    package sample;
     
    public class OverloadingVarargs {
           static void f(Character...args){
                  System.out.print("first ");
                  for(Character c:args)
                         System.out.print(c+" ");
                  System.out.println();
           }
     
           static void f(Integer...args){
                  System.out.print("second ");
                  for(Integer i:args)
                         System.out.print(i+" ");
                  System.out.println();
           }
          
           static void f(Long...args){
                  System.out.print("third ");
                  for(Long l:args)
                         System.out.print(l+" ");
                  System.out.println();
           }
          
           static void f(Double...args){
                  System.out.print("forth ");
                  for(Double d:args)
                         System.out.print(d+" ");
                  System.out.println();
           }
          
           public static void main(String[] args){
                  f('a','b','c');
                  f(1);
                  f(2,1);
                  f(0.1);
                  f(
           }
    }
     
    结果:
    first a b c
    second 1
    second 2 1
    forth 0.1
    third 0
     
    但下面的情况是不允许的,即某个方法中增加一个非可变参数。
     
    OverloadingVarargs2.java
    package sample;
     
    public class OverloadingVarargs2 {
           static void f(float i,Character...args){
                  System.out.println("first");
           }
     
           static void f(Character...args){
                  System.out.println("second");
           }
          
           public static void main(String[] args){
                  f(1,'a');
                  f('a','b');//Error
           }
    }
     
    但可以这样解决问题。
    package sample;
     
    public class OverloadingVarargs2 {
           static void f(float i,Character...args){
                  System.out.println("first");
           }
     
           static void f(char c,Character...args){
                  System.out.println("second");
           }
          
           public static void main(String[] args){
                  f(1,'a');
                  f('a','b');
           }
    }
    即重载的方法必须保持一致的参数形式。
  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254508.html
Copyright © 2011-2022 走看看