可变参数列表-Java SE5新特性(转)

Java1.5增加了新特性:
可变参数:
适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
注意:可变参数必须位于最后一项
当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持有一个可变参数
因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。

可变参数的特点:
(1)只能出现在参数列表的最后;
(2)...位于变量类型和变量名之间,前后有无空格都可以;
(3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

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,3.14,11.11);
              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)
(1)只支持不同类型参数的可变参数进行重载;
(2)不支持参数出现非可变参数和可变参数混合的情况;
如果出现重载的情况,则编译器会自动调用最适合的方法匹配之。
 
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(0l);

       }
}
 
结果:
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');//The method f(float, Character[]) is ambiguous for the type OverloadingVarargs2
       }
}
 
但可以这样解决问题。
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');
       }
}
使用可变参数时重载的方法必须保持一致的参数形式

http://www.blogjava.net/Carter0618/archive/2007/08/19/137889.html

import java.util.Arrays;
import java.util.List;

/*2015-9-15*/
public class VariableParameter {
    public static void main(String[] args) {
        VariableParameter vp = new VariableParameter();
        vp.process("p1", "p2", "p3");
    }

    public void process(String... parameters) {
        List<String> list = Arrays.asList(parameters);
        for (String parameter : list) {
            System.out.println(parameter);
        }
    }

}

输出:

p1
p2
p3

 

时间: 2024-11-02 12:41:25

可变参数列表-Java SE5新特性(转)的相关文章

Thinking in java 可变 参数列表问题,请各位帮忙解决。

问题描述 Thinking in java 可变 参数列表问题,请各位帮忙解决. public class OverloadingVarargs3 { static void f(float i Character... args) { System.out.println(""first""); } static void f(char c Character... args) { System.out.println(""second&quo

深入理解JVM内幕:从基本结构到Java 7新特性

转自:http://www.csdn.net/article/2012-12-05/2812509-Java-JVM CSDN首页>软件研发 深入理解JVM内幕:从基本结构到Java 7新特性 发表于2012-12-05 09:02|6064次阅读| 来源ImportNew|38 条评论| 作者 朱伟杰 JavaJVM编程语言 摘要:许多没有深入理解JVM的开发者也开发出了很多非常好的应用和类库.不过,如果你更加理解JVM的话,你就会更加理解Java,这样你会有助于你处理类似于我们前面的案例中的

Java 8新特性之旅:使用Stream API处理集合

在这篇"Java 8新特性教程"系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章"遍历.过滤.处理集合及使用Lambda表达式增强方法"中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组

Java 8 新特性终极版指南详解_java

前言: Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 – Lambdas and Concurrency.Java 8 Date Time API Tutorial : LocalDateTime和Abstract Class Versus Interface in the JDK 8 Era.本文还参考了一些其他资料,例如:15 Must

java-[Java]关于重载方法中的可变参数列表

问题描述 [Java]关于重载方法中的可变参数列表 <Thinking in Java>第105页有一句话不理解 如何理解你应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不是用它 解决方案 就是当重载一个方法时,选择其中的一个重载使用可变参数,其他的避免使用,否则编译的时候容易出问题.具体的参看http://www.cnblogs.com/lanxuezaipiao/p/3190673.html 解决方案二: 这个道理很简单,比如说你有foo(int x int ... args

java-[Java]可变参数列表的参数传递

问题描述 [Java]可变参数列表的参数传递 想问一下,可变参数列表Object... a 和 Object[] a 这两种写法到底有啥区别呢? class Abc{ } public class AboutObject { static void pr(Object... a){ //Object[] a for(Object i:a) System.out.print(i+" "); } public static void main(String[] args){ Object[

Java 8新特性 内建函数式接口详解_java

Java 8新特性内建函数式接口 在之前的一片博文 Lambda 表达式,提到过Java 8提供的函数式接口.在此文中,将介绍一下Java 8四个最基本的函数式接口 对于方法的引用,严格来讲都需要定义一个接口.不管我们如何操作实际上有可能操作的接口只有四种. Java 8 提供了函数式接口包java.util.function.*,在该包下有许多Java 8内建的函数式接口.不过基本上分为四种基本的: 功能型接口 (Function) 将 T 作为输入,返回 R 作为输出,他还包含了和其他函数组

Java 8新特性方法引用详细介绍_java

Java 8新特性方法引用 对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMethodName 引用对象方法:  Object:: methodName 引用特定类型方法: ClassName :: methodName 引用构造方法: ClassName  :: new  静态方法引用示例 /** * 静态方法引用 * @param <P> 引用方法

Java 8 新特性

这篇文章是一篇介绍Java8新特性英文博客的中文翻译,Java8发布有些时日,但是大家对它的了解和认识还不够,大部分企业和用户还停留在之前的版本中,本次翻译主要针对对Java8感兴趣和致力于从事Java开发的人员提供有价值的中文资料,希望能够对大家的工作和学习有所帮助.Java8的中文资料相对匮乏,这是我看过介绍Java8新特性最好的一篇文章,作者通过实例和理论相结合的方式,通俗易懂的阐述了Java8的一些新特性,今天让小村长为你揭开Java8的神秘面纱,一同走进码农的精神世界.注释 : 由于本