`
原来我就是麦兜
  • 浏览: 9710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[Java5新特性]可变参数

 
阅读更多

什么是可变参数

Java基础内容中,关于函数具有一种特性:重载,如果我们要完成多个数字想加的需求,可以按照以下代码完成:

public class Demo {
    public int add(int a, int b) {
        return a + b;
    }
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    public static void main(String[] args) {
        int sum1 = new Demo().add(1, 2);
        int sum2 = new Demo().add(1, 2, 3);
        System.out.println("第一次的结果为:" + sum1 + ";第二次的结果为:" + sum2);
    }
}

但是,这样完成的话,需要设置多个对应方法,还是不够简洁。我们可以利用数组的方式将其简化。

public class Demo {
    public int add(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        int sum3 = new Demo().add(new int[] { 1, 2, 3, 4, 5 });
        System.out.println("第三次的结果为:" + sum3);
    }
}

在Java 5版本之后,提供了可变参数的方式来完成,如下代码所示:

public class Demo {
    public int add(int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        int sum3 = new Demo().add(new int[] { 1, 2, 3, 4, 5 });
        System.out.println("第三次的结果为:" + sum3);
    }
}

从上面的两端代码中,我们可以看出,可变参数和数组参数在方法内部的内容是没有任何变化的。但是,在调用上可变参数要更灵活一些,例如以下代码:

public class Demo {
    public int add(int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        int sum4 = new Demo().add();
        System.out.println("第四次的结果为:" + sum4);
        int sum5 = new Demo().add(1);
        System.out.println("第五次的结果为:" + sum5);
        int sum6 = new Demo().add(1, 2, 3);
        System.out.println("第六次的结果为:" + sum6);
    }
}

在上述案例代码中,sum4的调用就相当于new int[] {},sum5的调用就相当于new int[] {1},而sum6的调用就相当于new int[] {1,2,3}。但在实际使用时,可变参数要比数组更灵活。

可变参数原理

目前我们已经掌握可变参数的用法。在实际使用中,我们发现可变参数与数组的形式非常类似,只是在调用时更加灵活。下面我们就研究一下可变参数的原理是怎样的,将上面的可变参数的代码进行反编译后得到如下结果:

public class Demo
{
  public int add(int[] arr)
  {
    int sum = 0;
    for (int i = 0; i < arr.length; ++i)
      sum += arr[i];
    return sum;
  }

  public static void main(String[] args) {
    int sum4 = new Demo().add(new int[0]);
    System.out.println("第四次的结果为:" + sum4);
    int sum5 = new Demo().add(new int[] { 1 });
    System.out.println("第五次的结果为:" + sum5);
    int sum6 = new Demo().add(1, 2, 3);
    System.out.println("第六次的结果为:" + sum6);
  }
}

通过查看反编译的代码结果后,我们发现通过Java 5版本的编译器,将可变参数编译为对应的数组内容进行传递。

可变参数应用

对应可变参数来说,有一种类似于C语言的实际应用,叫做字符串格式化,例如如下代码:

public class Demo {
    public static void main(String[] args) {
        // 字符串格式化案例
        System.out.println("I am zhangwuji,I like games,I am 18 years old!");
        System.out.println("I am zhouzhiruo,I like music,I am 18 years old!");
    }
}

上面的代码案例,可以利用可变参数改写成如下形式:

public class Demo {
    public static void main(String[] args) {
        // 字符串格式化案例
        String name = "zhangwuji";
        String hobby = "games";
        int age = 18;
        String format = "I am %s,I like %s,I am %d years old!";
        System.out.printf(format, name, hobby, age);
    }
}

通过查看底层代码,我们可以知道printf()方法就是接收了一个可变参数来完成的:

public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}

转载说明:请注明作者及原文连接,谢谢!

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    Java的可变参数讲解代码(使用方式、原理、结合泛型、使用元组或列表进行参数传递、 使用默认值、缓存计算结果、实战构建动态日志)

    Java可变参数(Varargs)是一种语言特性,允许方法接受可变数量的参数。在方法声明中使用省略号(...) 表示,可以将不定数量的参数传递给方法。可变参数使得方法更加灵活,可以接受任意数量的参数,并以数组形式访问...

    JAVA5新特性介绍.zip

    JDK1.5新特性:自动拆装箱、泛型、增强for循环、静态方法导入、可变参数、枚举

    java新特性简介.ppt

    自动装箱、拆箱 更优化的循环 可变长参数 枚举 静态引入 范型 Annotation(注解、注释)

    java三大特性说明

    清楚说明了java三大特性: 抽象:处理...由于接口的信息中只有已知不可变值以及抽象方法,所以信息的绑定方式单一,从实现上可以满足继承但也不会出现网状的信息绑定效果,不会增加访问时的节点数。因此接口允许多继承。

    Java 高级特性.doc

    2.可变参数与for循环增强 这个是一般的用法: public static void loop(String[] args){ for(int i=0;i;i++) { System.out.println(args[i]); } } 这个是JDK 增加的新特性的用法! public static void loop(int ...

    Java核心编程技术源码

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。《Java高手...

    java开源包5

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    Java基础知识点总结.docx

    可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 &lt;java.lang&gt;System 89 &lt;java.lang&gt;Runtime 90 &lt;java.lang&gt;Math 90 &lt;java.lang&gt;.Date:日期类,月份从0—11 92 &lt;java.lang&gt; Calendar:日历类 93 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java高手真经 编程基础卷.part1.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    Java高手真经 编程基础卷.part3.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    Java高手真经 编程基础卷.part4.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    Java高手真经 编程基础卷.part2.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包9

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

Global site tag (gtag.js) - Google Analytics