[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);
}


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

时间: 2024-10-27 05:11:25

[Java5新特性]可变参数的相关文章

jdk新特性——可变参数

public class array2{ public static void main(String[] args) { sayHello("beijing","xian"); } private static void sayHello(String ... args) { for (int i = 0; i < args.length; i++) System.out.println("hello," + args[i]+"

Java新特性--可变参数

可变参数: 1.在传递参数时就可以不受参数个数的限制,全部将参数以数组的形式保存下来. 2.可变参数的定义格式:返回值类型  方法名称(类型...参数名称){},注意:...位于变量类型和变量名之间 3.可参变数的定义必须放在参数列表的后面. 为什么可变参数的定义必须放在参数列表的后面呢? 在没有可变参数这一特性之前,Java是将接受到的参数类型传递给一个数组,用数组的形式,在方法中进行遍历,需要几个元素就添加几个元素(public static void fun(int a[]){}).后来有

JDK5.0新特性-可变参数

可变参数: 格式 类型... 变量 本质上这个参数是一个数组. 优点:1.传参数时可以传递数组,也可以传递多个值. 2.可以不传递值. Arrays.asList()可以将数组转换成List集合. 注意:得到的是一个固定长度的List集合. 原因:是因为数组长度是固定的,这个集合是由数组转换成的. 为什么要将数组转换成集合? 集合中提供更丰富的操作. int[] arr = { 1, 2, 3 }; List list = Arrays.asList(arr); System.out.print

JDK5新特性--可变参数

1.可变参数的引入 package cn; /**  * 可变参数  */ public class ChangeParameterDemo { public static void main(String[] args) { //2个数求和 int a = 10; int b = 20; int result = sum(a,b); System.out.println("result:"+result); int c = 30; result = sum(a,b,c); Syste

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

Java5新特性

"JDK1.5/Java5"的一个重要主题就是通过新增一些特性来简化开发. 这些特性包括泛型,for-each循环,自动装包/拆包,枚举,可变参数, 静态导入,注解. 使用这些特性有助于我们编写更加清晰,精悍,安全的代码. 1.泛型(Generic)C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能.一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换.猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到

java5 新特性

1.静态导入方法 Java代码   package com.java.new_features_jdk5; /** * * 一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*; * 这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法.当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了. * 然后在这个类中,就可以直接用方

java5新特性(简述十大新特性)

1.泛型 所谓类型擦除指的就是Java源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息.也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为Object类型,并在实际使用时强制转换为指定的目标数据类型.而C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码. Map<Integer, Integer> squares = new HashMap<Integer, Integer>()

[Java5新特性]Annotation注解

Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的"name=value"对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特殊的错误,不会影响代码的执行. 基本A