I have been writing java for a while, and today I encountered the following declaration:
public static void main(String... args) {
}
Note the "dot dot dot" in the array declaration, rather than the usual bracket []. Clearly it works. In fact I wrote a small test and verified it works. So, I pulled the java grammar to see where this syntax of argument declaration is, but did not find anything.
So to the experts out there, how does this work? Is it part of the grammar? Also, while I can declare function like this, I can't declare an array within a function's body like this.
Anyway, do you know of any place that has this documented. It is curiosity, and perhaps not worth of any time invested in it, but I was stumped.
It is
varargs
In simple term its an
Array
ofMember
likeWhen to use:
Generally while designing API it is good to use when number of argument is not fixed.
Example from standard API of this is
String.format(String format,Object... args)
Also See
Variable arguments. Can have 0 or more String arguments.
The function can access the parameters as an array of Strings.
Check out the Java Language Specification, Third Edition, Chapter 8 (Classes). Buried in there is this nugget:
Basically, the last parameter of any method call can have
T...
. If it has that, it is converted toT[]
.So basically, what you have is a fancy way of reproducing the more traditional
It means you can pass zero or more
Member
objects to thesetMembers()
method. In the setMembers method,members
will have array semantics.I believe this was implemented in Java 1.5. The syntax allows you to call a method with a comma separated list of arguments instead of an array.
is the same as:
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
It's the so-called varargs syntax. In the method body, you can read the
members
parameter as it were an array - actually, it /is/ 'just' an array.However, the magic bit is in calling the method. Before the
varargs
syntax was introduced, you'd call the method a bit like so:With the new varargs syntax however, you don't need to explicitly create the array anymore, and you can pass:
This does mean however that a
varargs
argument has to be the last argument in a method. Something like this is therefore not permitted:Summarized: It's a bit of syntactic sugar, really. I'm no expert on the inner workings of the Java compiler, but I'm pretty sure that methods calling a method that accept a
varargs
parameter are rebuilt into methods that build an array of the given type.