可变参数列表-Java SE5新特性
2013-06-29 17:13
267 查看
1.可变参数列表的简单实现
当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。在以前的Java代码中,可以使用Object数组来实现这样的功能。因为,所有的类都是直接或间接继承于Object类。
VarArgs.java
结果:
[align=left]47 3.14 11.11[/align]
[align=left]one two three[/align]
sample.A1@a90653 sample.A1@de6ced sample.A1@c17164
这里printArray方法使用Object数组作为参数,并使用foreach语法遍历数组,打印每个对象。
2.Java SE5实现可变参数列表
同样的方法,参数可以这样定义,(Object…args),这样达到同样的效果。
NewVarArgs.java
结果:
[align=left]47 3.14 11.11[/align]
[align=left]47 3.14 11.11[/align]
[align=left]one two three[/align]
[align=left]sample.A@a90653 sample.A@de6ced sample.A@c17164[/align]
1 2 3 4
这里没有显式的使用数组作为参数,但编译器实际上会为你填充数组。所以同样可以使用foreach语法来遍历之。
注意倒数第二行,编译器已经发现它是一个数组,所以不会在其上执行任何转换。最后一行表明,可以传递零个参数。
也可以指定所有可变参数的类型,下面的程序指定所有可变参数都必须是String。
OptionalArguments.java
结果:
[align=left]one[/align]
two three
可以在可变参数列表中同时使用原始类型与包装类。
AutoboxingVarargs.java
结果:
[align=left]1 2[/align]
[align=left]3 4 5 6 7 8 9[/align]
10 11 12
3.可变参数列表的重载(Overloading)
如果出现重载的情况,则编译器会自动调用最适合的方法匹配之。
OverloadingVarargs.java
结果:
[align=left]first a b c[/align]
[align=left]second 1[/align]
[align=left]second 2 1[/align]
[align=left]forth 0.1[/align]
third 0
但下面的情况是不允许的,即某个方法中增加一个非可变参数。
OverloadingVarargs2.java
但可以这样解决问题。
即重载的方法必须保持一致的参数形式。
当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。在以前的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()}); } } |
[align=left]47 3.14 11.11[/align]
[align=left]one two three[/align]
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(); } } |
[align=left]47 3.14 11.11[/align]
[align=left]47 3.14 11.11[/align]
[align=left]one two three[/align]
[align=left]sample.A@a90653 sample.A@de6ced sample.A@c17164[/align]
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(); } } |
[align=left]one[/align]
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); } } |
[align=left]1 2[/align]
[align=left]3 4 5 6 7 8 9[/align]
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( } } |
[align=left]first a b c[/align]
[align=left]second 1[/align]
[align=left]second 2 1[/align]
[align=left]forth 0.1[/align]
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 SE5新特性
- java可变参数列表
- 可变参数列表的实现--平均值
- Python3基础 函数的参数是可变参数,将传进来的参数转成列表
- fprintf 的封装(vsprintf,va_start(), va_arg(), va_end()可变参数列表)
- 可变参数列表求一组数的最大值
- 利用可变参数列表简单实现printf函数的功能
- 可变参数列表及printf函数的实现
- 主题六 函数(C语言核心)----34.可变参数列表
- (四)《Java编程思想》——可变参数列表
- 可变参数列表求一组数的最大值
- 可变参数列表,stdarg
- 可变参数 函数(可变参列表—2) 实现小型日志文件
- 【C/C++】sprintf中如何将容器作为可变参数列表传入
- 深度理解C语言可变参数列表
- 可变参数列表的剖析以及printf函数的实现
- 可变参数列表 va_list
- 第五章.初始化和清理 初始化可变参数列表
- 可变参数列表通过宏来实现(头文件stdarg.h)
- Java 可变长参数列表