myMethod("foo", "bar");myMethod("foo", "bar", "baz");myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array
然后,您可以使用String var作为数组:
public void myMethod(String... strings) {for (String whatever : strings) {// do what ever you want}
// the code above is equivalent tofor (int i = 0; i < strings.length; i++) {// classical for. In this case you use strings[i]}}
public class VarargsExample {public void displayData(String ... values){System.out.println("Number of arguments passed " + values.length);for(String s : values){System.out.println(s + " ");}}
public static void main(String[] args) {VarargsExample vObj = new VarargsExample();// four argsvObj.displayData("var", "args", "are", "passed");//three argsvObj.displayData("Three", "args", "passed");// no-argvObj.displayData();}}Output
Number of arguments passed 4varargsarepassedNumber of arguments passed 3ThreeargspassedNumber of arguments passed 0
void displayValues(int a, int b, int … values) // OKvoid displayValues(int a, int b, int … values, int c) // compiler error
varargs的另一个限制是必须只有一个varargs参数。
void displayValues(int a, int b, int … values, int … moreValues) // Compiler error
重载varargs方法
可以重载接受varargs参数的方法。Varargs方法可以通过-
重载
它的vararg参数的类型可以不同。添加其他参数。重载varargs方法示例
public class OverloadingVarargsExp {// Method which has string vararg parameterpublic void displayData(String ... values){System.out.println("Number of arguments passed " + values.length);for(String s : values){System.out.println(s + " ");}}
// Method which has int vararg parameterpublic void displayData(int ... values){System.out.println("Number of arguments passed " + values.length);for(int i : values){System.out.println(i + " ");}}
// Method with int vararg and one more string parameterpublic void displayData(String a, int ... values){System.out.println(" a " + a);System.out.println("Number of arguments passed " + values.length);for(int i : values){System.out.println(i + " ");}}
public static void main(String[] args) {OverloadingVarargsExp vObj = new OverloadingVarargsExp();// four string argsvObj.displayData("var", "args", "are", "passed");
// two int argsvObj.displayData(10, 20);
// One String param and two int argsvObj.displayData("Test", 20, 30);}}Output
Number of arguments passed 4varargsarepassed
Number of arguments passed 21020
a TestNumber of arguments passed 22030
Varargs和重载歧义
在某些情况下,调用可能会有歧义,而我们重载了varargs方法。举个例子
public class OverloadingVarargsExp {// Method which has string vararg parameterpublic void displayData(String ... values){System.out.println("Number of arguments passed " + values.length);for(String s : values){System.out.println(s + " ");}}
// Method which has int vararg parameterpublic void displayData(int ... values){System.out.println("Number of arguments passed " + values.length);for(int i : values){System.out.println(i + " ");}}
public static void main(String[] args) {OverloadingVarargsExp vObj = new OverloadingVarargsExp();// four string argsvObj.displayData("var", "args", "are", "passed");
// two int argsvObj.displayData(10, 20);
// This call is ambiguousvObj.displayData();}}
i.e. Suppose we pass an Object array to the ... argument - will the resultant argument value be a two-dimensional array - because an Object[] is itself an Object:
3)如果你想用一个参数调用方法,而它恰好是一个数组,你必须显式地包装它
another. method(new Object[]{array});ORmethod((Object)array), which will auto-wrap.
void m1(String ..., String s) this is a wrong approach give syntax error.void m1(String s, String ...); This is a right approach. Must always give last order prefernces.