如何应用Java的可变参数
创始人
2024-04-07 11:32:15
0

Java可变参数

Java语言在JDK1.5中首次推出Java可变参数,variable arguments,或简称varargs。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。但可变参数的应用并不像想象的那么简单,使用时有其特殊要求和局限性。

重载的最好例子

读者朋友可能有这样的编程经历:在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定。具体地讲,例如编写一个打印参加聚会party的程序,其中方法printInvitation()将根据作为参数的参加人姓名,打印邀请卡。但这个参数的数量事先并不确定。当然可以编写许多重载的方法来解决这个问题,如:   void printInvitation(String name); void printInvitation(String name1, String name2); void printInvitation(String name1, String name2, String name3); ...   问题是编写多少个重载的方法才可以解决给所有参加者打印邀请卡?也许需要改变您的程序设计,而使用数组或者链接表了。 应用可变参数可以方便、灵活地解决这类问题。例如:   //完整程序存在本书配套资源目录Ch12名为VarargsTest.java void printInvitation(String...names) {     for (String name : names) {         makeCard(name);             //调用方法按照姓名打印邀请卡         System.out.println("Recording info: invitation card has been printed for " + name);     } }   这里,(String...names)便是可变参数。它包括从0到任意个相同类型的参数。在编译期间,这个可变参数将被转换为字符串数组形式,即:   void printInvitation(String[] names)   如下是调用这个方法的例子:   printInvitation("李刚", "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 Smith Recording info: invitation card has been printed for Greg Wu Recording info: invitation card has been printed for Paul Nguyen Recording info: invitation card has been printed for Liu Wei Recording info: invitation card has been printed for 张新

怎样工作

       Java可变参数也不神秘。实际上,JVM将根据程序中调用这个方法时提供的参数数量,来装载和运行它。        可变参数的简单语法格式为:   methodName([argumentList], dataType...argumentName);          其中:        argumentList——普通参数,可选项。        dataType——数据类型或者类。自动转换成dataType代表的数组。        ...——Java的操作符。表示0到多个。必须是3个点。        argumentName——参数名。        注意,可变参数必须在最后。        下面是应用可变参数的更多例子:   // 完整程序存在本书配套资源目录Ch12名为VarargsTest.java public static int sumInts(int...numbers) {  //可变整数数组类型参数     int sum = 0;     for (int 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 + "\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) {     //语句体     ...     } void someMethod(double...prices) {              //重载     //语句体     ...     } double someMethod(String...names) {             //重载     //语句体     ... } ...          对方法someMethod()实行重载。对具有可变参数的方法重载遵循一般方法重载原则。        如下程序应用枚举和可变参数,对在12.4.4讨论过的根据用户要求打印跑车信息的程序进一步修改,使之具有更强功能。首先,在程序中加入了如下两个用来处理跑车颜色和付款方式的枚举类型对象:   //完整程序存在本书配套资源目录Ch12名为VarargsApp.java enum ColorType {     WHITE {String getDescription(){                 return "有浅白、暗白、和亮白可选";             }     },     SILVER {String getDescription() {                 return "有银白、银灰、纯银色可选";             }     },     BLACK {String getDescription() {                 return "有深黑和浅黑可选";             }     };     abstract String getDescription(); } enum PaymentType {     CASH("有10%特别优惠"),     CREDIT("接受所有信用卡"),     LOAN("贷款利息为.56%");     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...choices) {    //可变参数         type = null;                        //初始化         color = null;         payment = null;         processInfo(choices);               //调用处理信息方法    }    private void processInfo(String[] choices) {        if (choices.length == 1) {           //处理跑车类型           processType(choices[0]);         }        else if (choices.length == 2) {      //处理跑车类型和颜色          processType(choices[0]);          processColor(choices[1]);         }        else if (choices.length == 3) {      //处理跑车类型、颜色和付款方式          processType(choices[0]);          processColor(choices[1]);          processPayment(choices[2]);        }  }  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("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");       //创建两个参数的对象      System.out.println("我要的跑车信息:\n" + myCar + "\n");        SportCar herCar = new SportCar("F", "B", "C");//创建三个参数的对象      System.out.println("她要的跑车信息:\n" + herCar + "\n");     } }   运行结果如下:   你要的跑车信息: 制造国:德国 价格:$120,000.00   我要的跑车信息: 制造国:英国 价格:$110,000.00 有银白、银灰、纯银色可选   她要的跑车信息: 制造国: 意大利 价格:$150,000.00 有深黑和浅黑可选 有10%特别优惠  

【编辑推荐】

  1. Red Hat CEO呼吁甲骨文继续保持Java开放
  2. 自学Javabean迅速成为Java高手
  3. Java通过JNI调用C语言的方法
  4. 高手Java核心技术学习笔记
  5. 成为Java高手需要注意的25个学习目标

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...