当前位置:   article > 正文

Java中可变长参数的使用及注意事项_java可变参数坑

java可变参数坑

前言

在java编写代码时有时候会遇到这样一个需求:提供一个方法对入参类型相同的n个参数进行处理,若参数个数有7、8个或者参数个数不确定那么我们传统方式的方法就不适合了,java1.5中提供了一个可变参数的功能,以下主要探讨可变参数的使用及注意事项。

简介

java1.5提供了一个叫varargs的新功能,就是可变长度的参数。
“Varargs"是"variable number of arguments"的意思。有时候也被简单的称为"variable arguments”
定义实参个数可变的方法:只要在一个形参的"类型"与"参数名"之间加上三个连续的".“(即”…",英文里的句中省略号),就可以让它和不确定个实参相匹配。可变参数在方法内部本质上是一个数组。
java实例:

public class Test {
    public static void main(String[] args) {
        method1("张三","李四","王五");
    }

    public static void method1(String... names){
        for(String name:names){
            System.out.println(name);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

执行结果:

张三
李四
王五
  • 1
  • 2
  • 3

一、可变参数方法的定义

首先看下可变参数方法在代码上是如何定义的,如下所示:

public static void method2(Integer id, String... names) {    
  System.out.println("id:" + id + " names:" + names.length);
}
  • 1
  • 2
  • 3

通过上面的示例,我们可以看出在定义方法时,在最后一个形参类型后加上三点 …,就表示该形参可以接受多个相同类型的参数值,多个参数值被当成数组传入。

这里我们需要注意几个点:

  • 可变参数只能作为函数的最后一个参数,在其前面可以有也可以没有任何其他参数

  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数;

  • Java 的可变参数,会被编译器转型为一个数组;

上面提到可变参数的形式会被编译成一个数组,那么问题来了,我可不可以写两个下面这样的方法呢?

public static void method1(Integer id, String... names){
    System.out.println(names.length);
}

public static void method1(Integer id, String[] names){
    System.out.println(names.length);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在一个类中的定义相同名字的一个可变参数的方法和一个包含数组的方法,写完过后我们就发现 IDEA 已经提示我们这种写法的编译不了的了。
在这里插入图片描述

二、可变参数方法的调用

可变参数方法的调用跟其他方法的调用没什么区别,这里要说明的是,我们除了通过可变参数进行调用之外,还可以通过传入数组的形式来进行调用,如下所示:

public static void main(String[] args) {
    //不传递可变参数
    method1(1);
    //直接传递参数
    method1(2, "张三","李四","王五");
    //通过数组的形式传递参数
    String[] array = new String[]{"张三","李四","王五"};
    method1(3, array);
}

public static void method1(Integer id, String... names){
    System.out.println("id = "+id+",names参数的个数"+names.length);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

通过可变参数和数组的形式,这两种调用形式本质上是一样的;另外可变参数的个数也可以为 0。

可变参数的方法需要注意null指针的问题,最好在方法内部对参数进行判空处理,防止抛出空指针异常
在这里插入图片描述

三、可变参数方法的重载

试想一下如果我们定义了下面这样的两个方法,定义和使用的时候会是什么情况

public static void method1(String... names) {
	System.out.println("aaaaaaa");
}
public static void method1(String param1, String param2) {
    System.out.println("bbbbbbb");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

第一个是只有一个可变参数形参的方法;第二个是一个 String 类型的固定参数和第二个参数是可变参数的方法。首先,定义的时候完全没有问题,IDEA 也没有任何错误提示,编译也不会有问题。
在这里插入图片描述
通过实际的运行结果我们可以看到,输出的结果是​​bbbbbbb​​ 表示运行的是method1(String param1, String param2)这个方法,这说明什么问题呢?

说明当存在与可变参数方法形成重载方法的时候的,会优先固定参数的方法进行执行。 所以要注意可变参数方法重载可能会带出来的坑

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/156029?site
推荐阅读
相关标签
  

闽ICP备14008679号