我创建了一个带有public static void main(String arg[])
OR的Java应用程序public static void main(String[] arg)
但是昨天我发现,如果我用public static void main(String... args)
编译一个程序,这也完全正常工作。为什么?
这是因为String...
将被转换为String[]
根据jls§8.4.1
变量性方法的调用可能包含比形式形参更多的实际实参表达式。所有与可变参数之前的形式参数不对应的实际参数表达式将被求值,结果将存储到一个数组中,该数组将传递给方法调用。
在Java中声明varargs
是一个编译时错误:
String... abc={"abc","def"};
这是因为varargs
可以作为方法签名中的最后一个参数,并且正如jls中所说,varargs
将被求值,结果将存储在数组中,然后传递给方法
这是因为,
任何以Datatype ... var_name
形式写的东西都是var参数
可以接受任意数量的该类型的实参。
在这一点上和Array是一样的
ex: String ... args
等价于String[] args
这被称为可变长度参数,您可以发送任意数量的具有相同数据类型的参数。您可能会想到一个问题:"这些函数可以被重载吗?"答案是肯定的。
这个例子展示了VARGS是如何工作的
<>之前公共类VarargsTest
{//计算平均数
公共静态双平均数(双…数字)
{double total = 0.0;//初始化total
//使用增强的for语句
for (double d: numbers)
total += d计算total;
返回total/numbers.length;
}//end method average
public static void main(String args[])
{
double d1 = 10.0;
font =宋体;
double d3 = 30.0;
Printf ("d1 = %。1fnd2 = %。1fnd3 = %。1fnd4 = %。1fnn", d1, d2, d3, d4);
System.out。d和d2的平均值为%。
average(d1, d2)};
system . out。d1, d2和d3的平均值为%。
average(d1, d2, d3));
system . out。d1, d2, d3和d4的平均值为%。1fn",
average(d1, d2, d3, d1);
}//end main
}//end class VarargsTest