varargs(可变长度实参)

有时,需要创建实参数目根据实际情况可变的方法.例如,打开Internet连接的方法需要用户名,密码,文件名和协议等实参,但是如果不提供某些信息,可以使用默认值.这时,比较方便的做法是只传递没有默认值的实参.为了创建这样的方法,需要以某种方式创建可变长度(而不是固定长度)的实参列表.
过去,对于需要可变长度实参列表的方法采用两种处理办法,但都不能令人满意.一种办法是当实参的数目比较少,并且已知时,可以创建方法的重载版本,对每一个可能的方法调用创建一个版本.虽然这种办法很奏效,并且适合于某些情况,但是其应用范围还是很有限.如果实参数量很多或不可知,则使用第二种办法,把实参保存在一个数组中,然后把该数组传递给方法.坦率的讲,这两种办法都经常导致情况复杂化,因此需要一种更好的方式来处理可变长度实参列表的需求.
为了满足这种需要,从JDK5开始增加了一种功能来简化可变长度实参的方法和创建过程.该功能称为varargs(varible-length arguments的缩写).使用可变长度实参的方法称为variable-arity方法,或简称为varargs方法.varargs方法的形参列表的长度可变,数量不固定.因此,varargs方法可以接受可变数量的实参.
1.varargs基础
可变长度实参由3个句点指定(…).例如,下面的代码说明了如何编写一个带有可变长度实参的方法vaTest():
public class test2
{
    // @param args
    public static void main(String args[])
    {
     vaTest.test(1,2,3,4,5);
    }
}
class vaTest
{
    static void test(int ... v)
    {
        System.out.println("Number of  args:"+v.length);
    }
    
}
输出:
Number of args:5
注意v使用下面的语句声明:
int ... v
这种语法告诉编译器,test()方法可以带有0个或多个实参.而且,他把v隐式声明为一个int[]类型的数组.这样,在vaTest()内部,将使用正常的数组语法来访问v.
切记,可变长度形参必须位于最后,例如,下面的声明是错误的:
static void test(int ... v,string msg)
上面的代码试图在可变长度形参之后声明常规形参,这是非法的.还有一条限制需要说明:只能有一个可变长度形参.例如,下面的声明也是无效的:
static void test(int ... v, int ... v2)
2.重载varargs方法
可以重载接受可变长度实参的方法,例如,下面的程序重载vaTest()方法3次:
public class test2
{
    // @param args
    public static void main(String args[])
    {
     vaTest.test(1,2,3,4,5);
     vaTest.test(false,false,true);
     vaTest.test("aaa", 1,2,3,4);
    }
}
class vaTest
{
    static void test(int ... v)
    {
        System.out.println("Number of  args:"+v.length);
    }
    
    static void test(boolean ... v)
    {
        System.out.println("Number of boolean  args:"+v.length);
    }
    
    static void test(String msg,int ...v)
    {
        System.out.println(msg+" "+v.length);
    }
    
}
输出:
Number of args:5
Number of boolean args:3
aaa 4