Java中神奇的不定项参数(可变参数)

Java中神奇的不定项参数(可变参数)

问题

很多时候我们写Java都会遇到一个问题,那就是同一个方法,我们需要传入不同数量的参数,可能第一次调用要传入四个参数,第二次调用就要传入五个参数

appendString1("Int数据:", 2, 3, 5, 7);

appendString1("Int数据:", 15, 16, 11, 12, 13);

这样子看,大家一定会说:我知道,这就是重载嘛。相同函数名,不同的形参类型和数量,可以做到函数重载,只用调用一次函数。

但是,重载的话同样需要写两遍函数。2次还好,参数多的时候就会显得很繁琐,同时每次扩展都会很麻烦。

有人说了:那用数组,数组就没这个问题了。

appendString1(String s, int[] numbers);

这是一个解决问题的方法,但是这样还要先构造数组对象。

不定项参数(可变参数)

在Python中可以形参的数量和实参的数量不相同,只需要在调用的时候指定参数即可。但是Java不可以这样,于是Java中引入了不定项参数(可变参数)的概念。
不定项参数的语法如下:

返回值 方法名(参数类型...参数名称)
//是的,你没有看错就是省略号,格式就是这样,不是我省略了什么。
public static String appendString1(String s, int... numbers);

这样做就可以解决参数个数不确定的问题。

int… numbers可以理解为一个int数组,所以方法形参中int… 和 int[]是做不到重载的,因为本质一样。

//编译无法通过,因为本质上是一样的无法完成重载
public void method(int...args);
public void method(int[] args);

注意事项

  1. 不定项参数必须放在参数列表最后一个。
    原因:

    //编译错误,因为前面不定项,系统判断不出来最后一个int是int数组元素还是i
    public void method(int...args, int i)    
    
  2. 不定项参数只能有一个(多个,必然有一个不是最后一个)。

    //编译错误,提示不定项的参数必须放最后,系统不知哪些属于args1,哪些属于args2
    public void method(int...args1, int...args2)   
    public void method(int i, int j, int...args)   //正确用法
    public void method(String s, double d, int...args)   //正确用法
    
  3. 重载时,运行优先级问题。

    重载后在优先级上,确定参数的方法优先级高于不定项参数的方法

这个是很好用的,不需要向重载一样写很多遍,如果遇到类型的问题,则可以配合Object/泛型+不定项参数使用。

 public static <T> String appendString1(String s, T... ts) {
        for (int i = 0; i < ts.length; i++) {
            s += (ts[i] + ",");
        }
        return s;
    }

如果你觉得还不错的话请点个小赞,也欢迎收藏关注哦

在这里插入图片描述

发布了41 篇原创文章 · 获赞 94 · 访问量 9567

猜你喜欢

转载自blog.csdn.net/qq_41718454/article/details/104309010