您好,欢迎访问三七文档
Java可变参数Java语言在JDK1.5中首次推出Java可变参数,variablearguments,或简称varargs。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。但可变参数的应用并不像想象的那么简单,使用时有其特殊要求和局限性。重载的最好例子读者朋友可能有这样的编程经历:在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定。具体地讲,例如编写一个打印参加聚会party的程序,其中方法printInvitation()将根据作为参数的参加人姓名,打印邀请卡。但这个参数的数量事先并不确定。当然可以编写许多重载的方法来解决这个问题,如:voidprintInvitation(Stringname);voidprintInvitation(Stringname1,Stringname2);voidprintInvitation(Stringname1,Stringname2,Stringname3);...问题是编写多少个重载的方法才可以解决给所有参加者打印邀请卡?也许需要改变您的程序设计,而使用数组或者链接表了。应用可变参数可以方便、灵活地解决这类问题。例如://完整程序存在本书配套资源目录Ch12名为VarargsTest.javavoidprintInvitation(String...names){for(Stringname:names){makeCard(name);//调用方法按照姓名打印邀请卡System.out.println(Recordinginfo:invitationcardhasbeenprintedfor+name);}}这里,(String...names)便是可变参数。它包括从0到任意个相同类型的参数。在编译期间,这个可变参数将被转换为字符串数组形式,即:voidprintInvitation(String[]names)如下是调用这个方法的例子:printInvitation(李刚,DavidSmith);printInvitation(GregWu,PaulNguyen,LiuWei,张新);printInvitation();//无参数当在无参数情况下调用这个方法时,将不执行任何这个方法中的代码。如下是运行结果:Recordinginfo:invitationcardhasbeenprintedfor李刚Recordinginfo:invitationcardhasbeenprintedforDavidSmithRecordinginfo:invitationcardhasbeenprintedforGregWuRecordinginfo:invitationcardhasbeenprintedforPaulNguyenRecordinginfo:invitationcardhasbeenprintedforLiuWeiRecordinginfo:invitationcardhasbeenprintedfor张新怎样工作Java可变参数也不神秘。实际上,JVM将根据程序中调用这个方法时提供的参数数量,来装载和运行它。可变参数的简单语法格式为:methodName([argumentList],dataType...argumentName);其中:argumentList——普通参数,可选项。dataType——数据类型或者类。自动转换成dataType代表的数组。...——Java的操作符。表示0到多个。必须是3个点。argumentName——参数名。注意,可变参数必须在最后。下面是应用可变参数的更多例子://完整程序存在本书配套资源目录Ch12名为VarargsTest.javapublicstaticintsumInts(int...numbers){//可变整数数组类型参数intsum=0;for(intnum:numbers)sum+=num;returnsum;}再如:publicvoidtotalTax(Stringname,doublerate,double...amount){//普通参数在前、可变参数在后doubletotal=0.0,tax=0.0;for(doubleamount:amounts)total+=amount;tax=total*rate;System.out.println(Name:+name+\nTotal:+total+\ntax:+tax);}Java可变参数也可应用在构造器中。例如:publicclassSupper{publicSupper(char...characters){...}在子类中,可以覆盖这个构造器,如:classSubClassextendsSupper{publicSubClass(char...characters){...}}但无法在子类中调用超类的这个构造器。更多信息可变参数可以用在构造器中,并可以覆盖。Java可变参数方法重载可以对具有可变参数的方法重载。如下例子:voidsomeMethod(intcount,double...prices){//语句体...}voidsomeMethod(double...prices){//重载//语句体...}doublesomeMethod(String...names){//重载//语句体...}...对方法someMethod()实行重载。对具有可变参数的方法重载遵循一般方法重载原则。如下程序应用枚举和可变参数,对在12.4.4讨论过的根据用户要求打印跑车信息的程序进一步修改,使之具有更强功能。首先,在程序中加入了如下两个用来处理跑车颜色和付款方式的枚举类型对象://完整程序存在本书配套资源目录Ch12名为VarargsApp.javaenumColorType{WHITE{StringgetDescription(){return有浅白、暗白、和亮白可选;}},SILVER{StringgetDescription(){return有银白、银灰、纯银色可选;}},BLACK{StringgetDescription(){return有深黑和浅黑可选;}};abstractStringgetDescription();}enumPaymentType{CASH(有10%特别优惠),CREDIT(接受所有信用卡),LOAN(贷款利息为.56%);finalprivateStringpayment;privatePaymentType(Stringpayment){this.payment=payment;}publicStringgetPayment(){returnpayment;}}另外,在SportCar中,根据用户的选择,加入了对跑车类型、颜色,以及付款方式的处理方法,并且利用可变参数。例如:classSportCar{SportCarTypetype;//创建ColorTypecolor;PaymentTypepayment;publicSportCar(String...choices){//可变参数type=null;//初始化color=null;payment=null;processInfo(choices);//调用处理信息方法}privatevoidprocessInfo(String[]choices){if(choices.length==1){//处理跑车类型processType(choices[0]);}elseif(choices.length==2){//处理跑车类型和颜色processType(choices[0]);processColor(choices[1]);}elseif(choices.length==3){//处理跑车类型、颜色和付款方式processType(choices[0]);processColor(choices[1]);processPayment(choices[2]);}}privatevoidprocessType(Stringtype){//处理类型if(type.equals(P))this.type=SportCarType.PORSCHE;elseif(type.equals(F))this.type=SportCarType.FERRARI;elseif(type.equals(J))this.type=SportCarType.JAGUAR;}...这个类的驱动程序如下:publicclassVarargsApp{publicstaticvoidmain(Stringargs[]){SportCaryourCar=newSportCar(P);//创建一个参数的对象System.out.println(你要的跑车信息:\n+yourCar+\n);SportCarmyCar=newSportCar(J,S);//创建两个参数的对象System.out.println(我要的跑车信息:\n+myCar+\n);SportCarherCar=newSportCar(F,B,C);//创建三个参数的对象System.out.println(她要的跑车信息:\n+herCar+\n);}}运行结果如下:你要的跑车信息:制造国:德国价格:$120,000.00我要的跑车信息:制造国:英国价格:$110,000.00有银白、银灰、纯银色可选她要的跑车信息:制造国:意大利价格:$150,000.00有深黑和浅黑可选有10%特别优惠在Java5中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print(hello);print(hello,lisi);print(hello,张三,alexia);下面介绍如何定义可变长参数以及如何使用可变长参数。1.可变长参数的定义使用...表示可变长参数,例如print(String...args){...}在具有可变长参数的方法中可以把参数当成数组使用,例如可以循环输出所有的参数值。print(String...args){for(Stringtemp:args)System.out.println(temp);}2.可变长参数的方法的调用调用的时候可以给出任意多个参数也可不给参数,例如:print();print(hello);print(hello,lisi);print(hello,张三,alexia)3.可变长参数的使用规则3.1在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。看下面代码的输出:复制代码packagecom;//这里使用了静态导入importstaticjava.lang.System.out;publicclassVarArgsTest{publicvoidprint(String...args){for(inti=0;iargs.length;i++){out.println(args[i]);}}publicvoidprint(Stringtest){out.println(----------);}publicstaticvoidmain(String[]args){VarArgsTesttest=newVarArgsTest();test.print(hello);test.print(hello,alexia);}}复制代码3.2如果要调用的方法可以和两个可变参数匹配,则出现错误,例如下面的代码:复制代码packagecom;//这里使用了静态导入importstaticjava.lang.System.out;publicclassVarArgsTest1{publicvoidprint(String...args){for(inti=0;iargs.length;i++){out.println(args[i]);}}publicv
本文标题:Java可变参数
链接地址:https://www.777doc.com/doc-2880763 .html