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);
注意事项
-
不定项参数必须放在参数列表最后一个。
原因://编译错误,因为前面不定项,系统判断不出来最后一个int是int数组元素还是i public void method(int...args, int i)
-
不定项参数只能有一个(多个,必然有一个不是最后一个)。
//编译错误,提示不定项的参数必须放最后,系统不知哪些属于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) //正确用法
-
重载时,运行优先级问题。
重载后在优先级上,确定参数的方法优先级高于不定项参数的方法
这个是很好用的,不需要向重载一样写很多遍,如果遇到类型的问题,则可以配合Object/泛型+不定项参数使用。
public static <T> String appendString1(String s, T... ts) {
for (int i = 0; i < ts.length; i++) {
s += (ts[i] + ",");
}
return s;
}
如果你觉得还不错的话请点个小赞,也欢迎收藏关注哦