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

我一直在写java,今天我遇到了下面的声明:

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

请注意数组声明中的“点圆点”,而不是通常的括号[]。 很明显,它的作品。 事实上,我写了一个小testing,并validation了它的工作原理。 所以,我拉了java语法来看看这个参数声明的语法是什么,但没有find任何东西。

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

无论如何,你是否知道有这个logging的地方。 这是好奇心,也许不值得花时间去投资,但是我被困住了。

查看Java语言规范第三版第8章(类) 。 埋在这里有这块金块:

如果最后一个forms参数是typesT的variablesarity参数,则认为它定义了typesT []的forms参数。 该方法是一个可变的方法。 否则,这是一个固定的方法。 variablesarity方法的调用可能包含比forms参数更多的实际参数expression式。 所有与variablesarity参数前面的forms参数不相对应的实际参数expression式将被计算,并将结果存储到将传递给方法调用(第15.12.4.2节)的数组中。

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

所以基本上,你所拥有的是复制更传统的奇特方式

 String[] args 

我相信这是在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的

这是varargs

简单来说就是它的一个Member Array

 public setMembers(Member[] members); 

何时使用:

在deviseAPI时一般在参数数不固定的时候使用是很好的。

来自这个标准API的例子是String.format(String format,Object... args)

另见

  • VAR-ARG-的对象arrays-VS-对象arrays试图理解的-A-SCJP自检

这是所谓的varargs语法。 在方法体中,可以像读取数组一样读取members参数 – 实际上,它只是一个数组。

然而,这个魔法在调用这个方法。 在varargs语法被引入之前,你可以调用这个方法:

 setMembers(new Members[] {member1, member2, member3}); 

然而,使用新的可变参数语法,您不需要显式创build该数组,而是可以传递:

 setMembers(member1, member2, member3); 

然而,这确实意味着varargs参数必须是方法中的最后一个参数。 这样的东西是不允许的:

 void setMembers(Member ... members, String memberType); 

总结:这是一个语法糖,真的。 我不是Java编译器的内部工作的专家,但我敢肯定调用接受varargs参数的方法的方法被重build成构build给定types的数组的方法。

您可能需要阅读Java中的使用variables参数(或可变参数) 。

这意味着您可以将零个或多个Member对象传递给setMembers()方法。 在setMembers方法中, members将具有数组语义。

它被称为可变参数(varadic argument):一个函数,可以根据需要使用尽可能多的(包括零)参数。 例如, main("string1", "string2", "string3")声明为void main(String...args)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

variables参数 。 可以有0个或更多的string参数。

该函数可以以string数组的forms访问参数。

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