Java数组参数声明语法“...”如何工作?

时间:2010-11-18 02:23:24

标签: java arrays declaration

我已经写了一段时间了,今天我遇到了以下声明:

public static void main(String... args) {

}

注意数组声明中的“dot dot dot”,而不是通常的括号[]。显然它有效。事实上,我写了一个小测试,并验证它的工作原理。所以,我拉了java语法,看看这个参数声明的语法在哪里,但没有找到任何东西。

那么对那里的专家来说,这是如何工作的?它是语法的一部分吗?另外,虽然我可以像这样声明函数,但是我不能像这样在函数体内声明一个数组。

无论如何,你知道任何有这个记录的地方。这是好奇心,也许不值得投入任何时间,但我很难过。

10 个答案:

答案 0 :(得分:34)

我相信这是在Java 1.5中实现的。语法允许您使用逗号分隔的参数列表而不是数组来调用方法。

public static void main(String... args);
main("this", "is", "multiple", "strings");

与:

相同
public static void main(String[] args);
main(new String[] {"this", "is", "multiple", "strings"});

http://today.java.net/article/2004/04/13/java-tech-using-variable-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

答案 1 :(得分:30)

查看Java Language Specification, Third Edition, Chapter 8 (Classes)。埋藏在这里的是这个金块:

  

如果最后一个形式参数是类型为T的变量arity参数,则认为它定义了类型为T []的形式参数。然后该方法是可变的arity方法。否则,它是一种固定的arity方法。变量arity方法的调用可能包含比形式参数更多的实际参数表达式。将评估与变量arity参数之前的形式参数不对应的所有实际参数表达式,并将结果存储到将传递给方法调用的数组中(第15.12.4.2节)。

基本上,任何方法调用的最后一个参数都可以有T...。如果有,则转换为T[]

所以基本上,你所拥有的是一种复制传统

的奇特方式
String[] args

答案 2 :(得分:22)

答案 3 :(得分:8)

答案 4 :(得分:6)

答案 5 :(得分:4)

答案 6 :(得分:3)

它被称为varadic参数:一个函数,可以根据需要获取尽可能多的(包括零)参数。 例如,如果main声明为main("string1", "string2", "string3"),则main({"string1", "string2", "string3"})void main(String...args)相同。

请参阅http://www.java-tips.org/blog/java-se/varargs-%E2%80%93-java-50-addition.html

答案 7 :(得分:3)

答案 8 :(得分:2)

Variable arguments。可以有0个或更多String参数。

该函数可以作为字符串数组访问参数。

答案 9 :(得分:0)

这意味着该方法接受可变数量的String参数。参数被视为一个数组,因此可以按照下标的顺序访问它们。