zoukankan      html  css  js  c++  java
  • [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);
    }
    

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

  • 相关阅读:
    日程管理APP测试用例
    日程管理APP的测试计划和测试矩阵
    Bug report——仿网易新闻APP
    NABCD模拟实验
    5w1h

    小组作业
    code review
    Mutual review
    阅读思考
  • 原文地址:https://www.cnblogs.com/longestory/p/4566987.html
Copyright © 2011-2022 走看看