Java 可变参数_第1页
Java 可变参数_第2页
Java 可变参数_第3页
Java 可变参数_第4页
Java 可变参数_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java可变参数Java语言在JDK1.5中首次推出Java可变参数,variable arguments,或简称varargs。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。但可变参数的应用并不像想象的那么简单,使用时有其特殊要求和局限性。重载的最好例子读者朋友可能有这样的编程经历:在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定。具体地讲,例如编写一个打印参加聚会party的程序,其中方法printInvitation()将根据作为参数的参加人姓名,打印邀请卡。但这个参数的数量事先并不确定。当然可以编写许多重载的方法来解决这个问题,如: void pr

2、intInvitation(String name);void printInvitation(String name1, String name2);void printInvitation(String name1, String name2, String name3);. 问题是编写多少个重载的方法才可以解决给所有参加者打印邀请卡?也许需要改变您的程序设计,而使用数组或者链接表了。应用可变参数可以方便、灵活地解决这类问题。例如: /完整程序存在本书配套资源目录Ch12名为VarargsTest.javavoid printInvitation(Ss) for (St

3、ring name : names) makeCard(name); /调用方法按照姓名打印邀请卡 System.out.println("Recording info: invitation card has been printed for " + name); 这里,(Ss)便是可变参数。它包括从0到任意个相同类型的参数。在编译期间,这个可变参数将被转换为字符串数组形式,即: void printInvitation(String names) 如下是调用这个方法的例子: printInvitation("李刚", "

4、David Smith");printInvitation("Greg Wu", "Paul Nguyen", "Liu Wei", "张新");printInvitation(); /无参数 当在无参数情况下调用这个方法时,将不执行任何这个方法中的代码。如下是运行结果: Recording info: invitation card has been printed for 李刚Recording info: invitation card has been printed for David Smit

5、hRecording info: invitation card has been printed for Greg WuRecording info: invitation card has been printed for Paul NguyenRecording info: invitation card has been printed for Liu WeiRecording info: invitation card has been printed for 张新怎样工作 Java可变参数也不神秘。实际上,JVM将根据程序中调用这个方法时提供的参数数量,来装载和运行它。 可变参数的

6、简单语法格式为: methodName(argumentList, dataType.argumentName); 其中: argumentList普通参数,可选项。 dataType数据类型或者类。自动转换成dataType代表的数组。 .Java的操作符。表示0到多个。必须是3个点。 argumentName参数名。 注意,可变参数必须在最后。 下面是应用可变参数的更多例子: / 完整程序存在本书配套资源目录Ch12名为VarargsTest.javapublic static int sumInts(int.numbers) /可变整数数组类型参数 int sum = 0; for (i

7、nt num : numbers) sum +=num; return sum; 再如: public void totalTax(String name, double rate, double.amount) /普通参数在前、可变参数在后 double total = 0.0, tax = 0.0; for (double amount : amounts) total += amount; tax = total * rate; System.out.println("Name: " + name + "nTotal: " + total + &q

8、uot;ntax: " + tax); Java可变参数也可应用在构造器中。例如: public class Supper public Supper(char.characters) . 在子类中,可以覆盖这个构造器,如: class SubClass extends Supper public SubClass(char.characters) . 但无法在子类中调用超类的这个构造器。 更多信息 可变参数可以用在构造器中,并可以覆盖。Java可变参数方法重载 可以对具有可变参数的方法重载。如下例子: void someMethod(int count, double.prices

9、) /语句体 . void someMethod(double.prices) /重载 /语句体 . double someMethod(Ss) /重载 /语句体 . 对方法someMethod()实行重载。对具有可变参数的方法重载遵循一般方法重载原则。 如下程序应用枚举和可变参数,对在12.4.4讨论过的根据用户要求打印跑车信息的程序进一步修改,使之具有更强功能。首先,在程序中加入了如下两个用来处理跑车颜色和付款方式的枚举类型对象: /完整程序存在本书配套资源目录Ch12名为VarargsApp.javaenum ColorType WHITE String getDes

10、cription() return "有浅白、暗白、和亮白可选" , SILVER String getDescription() return "有银白、银灰、纯银色可选" , BLACK String getDescription() return "有深黑和浅黑可选" ; abstract String getDescription();enum PaymentType CASH("有10%特别优惠"), CREDIT("接受所有信用卡"), LOAN("贷款利息为.56%&qu

11、ot;); final private String payment; private PaymentType(String payment) this. payment = payment; public String getPayment() return payment; 另外,在SportCar中,根据用户的选择,加入了对跑车类型、颜色,以及付款方式的处理方法,并且利用可变参数。例如: class SportCar SportCarType type; /创建 ColorType color; PaymentType payment; public SportCar (String.c

12、hoices) /可变参数 type = null; /初始化 color = null; payment = null; processInfo(choices); /调用处理信息方法 private void processInfo(String choices) if (choices.length = 1) /处理跑车类型 processType(choices0); else if (choices.length = 2) /处理跑车类型和颜色 processType(choices0); processColor(choices1); else if (choices.length

13、 = 3) /处理跑车类型、颜色和付款方式 processType(choices0); processColor(choices1); processPayment(choices2); private void processType(String type) /处理类型 if (type.equals("P") this.type = SportCarType.PORSCHE; else if (type.equals("F") this.type = SportCarType.FERRARI; else if(type.equals("

14、J") this.type = SportCarType.JAGUAR;. 这个类的驱动程序如下: public class VarargsApp public static void main( String args ) SportCar yourCar = new SportCar("P"); /创建一个参数的对象 System.out.println("你要的跑车信息:n" + yourCar + "n"); SportCar myCar = new SportCar("J", "S&q

15、uot;); /创建两个参数的对象 System.out.println("我要的跑车信息:n" + myCar + "n"); SportCar herCar = new SportCar("F", "B", "C");/创建三个参数的对象 System.out.println("她要的跑车信息:n" + herCar + "n"); 运行结果如下: 你要的跑车信息:制造国:德国价格:$120,000.00 我要的跑车信息:制造国:英国价格:$110,0

16、00.00有银白、银灰、纯银色可选 她要的跑车信息:制造国: 意大利价格:$150,000.00有深黑和浅黑可选有10%特别优惠在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print("hello","lisi");print("hello","张三", "alexia");下面介绍如何定义可变长参数 以及如何使用可变长参数。1. 可变长参数的定义使用.

17、表示可变长参数,例如print(String. args) .在具有可变长参数的方法中可以把参数当成数组使用,例如可以循环输出所有的参数值。print(String. args) for(String temp:args) System.out.println(temp);2. 可变长参数的方法的调用调用的时候可以给出任意多个参数也可不给参数,例如:print();print("hello");print("hello","lisi");print("hello","张三", "ale

18、xia")3. 可变长参数的使用规则3.1 在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。看下面代码的输出:复制代码package com;/ 这里使用了静态导入import static java.lang.System.out;public class VarArgsTest public void print(String. args) for (int i = 0; i < args.length; i+) out.println(argsi); public void print(String test) out.

19、println("-"); public static void main(String args) VarArgsTest test = new VarArgsTest(); test.print("hello"); test.print("hello", "alexia"); 复制代码3.2 如果要调用的方法可以和两个可变参数匹配,则出现错误,例如下面的代码:复制代码package com;/ 这里使用了静态导入import static java.lang.System.out;public class Va

20、rArgsTest1 public void print(String. args) for (int i = 0; i < args.length; i+) out.println(argsi); public void print(String test,String.args ) out.println("-"); public static void main(String args) VarArgsTest1 test = new VarArgsTest1(); test.print("hello"); test.print("

21、hello", "alexia"); 复制代码对于上面的代码,main方法中的两个调用都不能编译通过,因为编译器不知道该选哪个方法调用,如下所示:3.3 一个方法只能有一个可变长参数,并且这个可变长参数必须是该方法的最后一个参数以下两种方法定义都是错误的。 public void test(String. strings,ArrayList list) public void test(String. strings,ArrayList. list) 4. 可变长参数的使用规范4.1 避免带有可变长参数的方法重载:如3.1中,编译器虽然知道怎么调用,但人容易陷入调

22、用的陷阱及误区4.2 别让null值和空值威胁到变长方法,如3.2中所示,为了说明null值的调用,重新给出一个例子:复制代码package com;public class VarArgsTest1 public void print(String test, Integer. is) public void print(String test,String.args ) public static void main(String args) VarArgsTest1 test = new VarArgsTest1(); test.print("hello"); tes

23、t.print("hello", null); 复制代码这时会发现两个调用编译都不通过:因为两个方法都匹配,编译器不知道选哪个,于是报错了,这里同时还有个非常不好的编码习惯,即调用者隐藏了实参类型,这是非常危险的,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。对于本例来说应该做如下修改: public static void main(String args) VarArgsTest1 test = new VarArgsTest1(); String strs = null; test.print("hello",

24、strs); 4.3 覆写变长方法也要循规蹈矩下面看一个例子,大家猜测下程序能不能编译通过:复制代码package com;public class VarArgsTest2 /* * param args */ public static void main(String args) / TODO Auto-generated method stub / 向上转型 Base base = new Sub(); base.print("hello"); / 不转型 Sub sub = new Sub(); sub.print("hello"); / 基类class Base void print(String. args) System.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论