zoukankan      html  css  js  c++  java
  • Java 可变参数列表

    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');
           }
    }
    即重载的方法必须保持一致的参数形式。
  • 相关阅读:
    关于使用quartz动态增删改定时任务
    关于chrome被篡改主页修复方法
    关于git被误删除的分支还原问题
    mysql数据库备份bat脚本
    同步数据库bat脚本
    读取spring boot项目中resource目录下的文件
    使用Java进行udp-demo编程时碰到的consumer和producter无法连接并报出“java.net.SocketException: Can't assign requested address”问题
    关于在项目中遇到MySQL数据库死锁的问题
    Gitlab仓库搭建及在Linux/windows中的免密使用
    GIT
  • 原文地址:https://www.cnblogs.com/xuecanmeng/p/5203399.html
Copyright © 2011-2022 走看看