Java 可变参数列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
 
这里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
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‘);
       }
}
即重载的方法必须保持一致的参数形式。

以上是关于Java 可变参数列表的主要内容,如果未能解决你的问题,请参考以下文章

Java 可变参数列表

java——慎用可变参数列表

Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?

15 可变参数列表

Java可变参数

Java中方法内的可变参数怎么使用