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自检
这被称为可变参数,在这里检查:
官方文档(Java 1.5)在这里:
这是所谓的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参数。 这些参数被视为一个数组,所以被下标访问,按照它们传入的顺序。