概述:

Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。

格式:

java之可变参数
上面所说的不确定也包括0,所以不给可变参数传递实参也是可以的,注意这时传递的是一个空数组(int[]{})而不是null。

方法:

传递的方式:
  其实在实参传递过来的过程中,编译器会把最后一个可变参数的形参转化为数组形参,所以相当于是获取了一个数组形参,那么我们就需要用遍历的方法去获取里面的每一个实参。例如:
java之可变参数

可变参数可以用于方法的重载,但是不能与相同数据类型的形参数组作为同个方法的重载判断依据,因为可变参数在编译器编译后也会变成一个形参数组所以会引起它们的相互冲突。例如:

java之可变参数

方法的重载还可能出现这种情况:当调用方法时传入一个参数,有一个可变参数的方法和一个单个参数的方法都能与之匹配,那么他会执行固定个数的那个方法。如果有实参个数固定的与之匹配,那么它的优先级要可变参数的优先级。如图:

java之可变参数
那么可变参数是否可以用形参数组的方式传递实参呢?答案是肯定的,因为他通过编译后传过去就是一个实参数组,所以完全可以直接在传参的时候传递一个实参数组过去。换过来,参数数组是不能用可变参数的方式来传参的。如图:
java之可变参数
还可以在可变参数中应用泛型。如图:

java之可变参数

特点:

  1. 只能出现在参数列表的最后;
  2. ...位于变量类型和变量名之间,前后有无空格都可以;
  3. 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。

结论:

可变参数的核心是将参数封装为数组,但是传入null时并不是只含有一个null元素的数组,而是null。

可变参数方便调用者传入不数量的参数且不需要在前面非常不优雅的构造数组对象。