可变参数列表

来源:互联网 发布:特斯拉电磁塔升级数据 编辑:程序博客网 时间:2024/05/23 15:36

用Object数组作为接收参数的数组:

package Varargs;class A{}public class VarArgs {static void printArray(Object[] args){for(Object obj:args){System.out.print(obj+" ");}System.out.println();System.out.println("******************************************");}public static void main(String[] args) {printArray(new Object[]{47,3.14,11.11});printArray(new Object[]{new Integer(47),new Float(3.14),new Double(11.11)});printArray(new Object[]{"one","two","three"});printArray(new Object[]{new A(),new A(),new A()});}}

 

这种方式的缺点是必须声明一个new Object[]{},才能够传递给printArray()方法。

下面这种方法的话就可以I省略数组的声明了:

package Varargs;public class NewVarArgs {static void printArray(Object... args){for(Object obj:args){System.out.print(obj+" ");}System.out.println();System.out.println("******************************************");}public static void main(String[] args) {printArray(47,3.14,11.11);printArray(new Integer(47),new Float(3.14),new Double(11.11));printArray("one","two","three");printArray(new A(),new A(),new A());//这种形式也可以接收数组printArray((Object)new Integer[]{1,2,3,4});//还可以为空printArray();}}


在方法的接收类型中声明为:(Object...args),就可以直接接受所传递的参数。倒数第二行可以看出,也可以接收数组。

最后一行可以看出将0个参数传递给可变参数列表也是可行的,当具有可选的尾随参数时,这一特征就会很有用:

package Varargs;public class OptionalTrailingArguments {static void f(int required,String... args){for(String s : args){System.out.print(s+" ");}System.out.println();System.out.println("*******************************");}public static void main(String[] args) {f(0);f(1,"one");f(2,"two","three");}}


在可变参数列表中可以使用任何类型的参数,包括基本类型,比如:

package Varargs;public class VarargType {static void f(Character...args){System.out.println(args.getClass());System.out.println("length:"+args.length);}static void g(int...args){System.out.println(args.getClass());System.out.println("length:"+args.length);}public static void main(String[] args){f('a');//注意上面是单引号,不是双引号啊。单引号是Character,双引号是Stringf();g(1);g();//下面的这个数组和上面的接收的Int类型的方法是相同的格式,注意对比System.out.println("int[]:"+new int[0].getClass());//这样证明了可变参数列表不依赖于自动包装机制,而实际上上使用的是基本类型}}


需要说明的是,Integer和int类型的数据,可以和平相处,方法进行参数的接收的时候,没有影响,不需要我们进行转换:

package Varargs;public class AutoboxingVarargs {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);f(9,new Integer(10),11);}}

 

——来自:Think in java

 

 

原创粉丝点击