下面方法中字符串后面的3个点是什么意思?

public void myMethod(String... strings) {
    // method body
}

当前回答

它是Varargs:)

varargs是可变长度参数的缩写,它允许方法接受可变数量的参数(零或更多)。使用可变参数,创建需要接受可变数量参数的方法变得很简单。Java 5中增加了变量参数的特性。

可变参数的语法

可变参数由数据类型后的三个省略号(三个点)表示,其一般形式为

return_type method_name(data_type ... variableName){
}  

需要可变参数

在Java 5之前,如果需要可变数量的参数,有两种方法来处理它

If the max number of arguments, a method can take was small and known, then overloaded versions of the method could be created. If the maximum number of arguments a method could take was large or/and unknown then the approach was to put those arguments in an array and pass them to a method which takes array as a parameter. These 2 approaches were error-prone - constructing an array of parameters every time and difficult to maintain - as the addition of new argument may result in writing a new overloaded method.

可变参数的优点

提供了一个更简单的选项。 更少的代码,因为不需要编写重载方法。

可变参数的例子

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 args
  vObj.displayData("var", "args", "are", "passed");
  //three args
  vObj.displayData("Three", "args", "passed");
  // no-arg
  vObj.displayData();
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 
Number of arguments passed 3
Three 
args 
passed 
Number of arguments passed 0

It can be seen from the program that length is used here to find the number of arguments passed to the method. It is possible because varargs are implicitly passed as an array. Whatever arguments are passed as varargs are stored in an array which is referred by the name given to varargs. In this program array name is values. Also note that method is called with different number of argument, first call with four arguments, then three arguments and then with zero arguments. All these calls are handled by the same method which takes varargs.

使用可变参数的限制

在方法中也可以使用其他参数,但在这种情况下,varargs参数必须是方法声明的最后一个参数。

void displayValues(int a, int b, int … values) // OK
   void displayValues(int a, int b, int … values, int c) // compiler error

使用可变参数的另一个限制是只能有一个可变参数。

void displayValues(int a, int b, int … values, int … moreValues) // Compiler error

重载可变参数方法

重载一个接受可变参数的方法是可能的。 可变参数方法可以通过-重载

其变量参数的类型可以不同。 通过添加其他参数。 重载可变参数方法的例子

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public 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 parameter
 public 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 parameter
 public 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 args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // One String param and two int args
  vObj.displayData("Test", 20, 30);
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 

Number of arguments passed 2
10 
20

 a Test
Number of arguments passed 2
20 
30 

可变参数和重载歧义

在某些情况下,当我们重载可变参数方法时,调用可能是模棱两可的。 让我们看一个例子

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public 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 parameter
 public 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 args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // This call is ambiguous
  vObj.displayData();
 }
}

在这个程序中,当我们调用没有任何参数的displayData()方法时,它会抛出错误,因为编译器不确定这个方法调用是否用于displayData(String…或者displayData(int…值)

同样,如果我们有重载方法,其中一个方法有一种类型的可变参数方法,而另一个方法有一个参数和同一类型的可变参数参数,那么我们也有歧义- As Exp - displayData (int…displayData(int a, int…)值)

这两个重载的方法总是有歧义。

其他回答

A really common way to see a clear example of the use of the three dots it is present in one of the most famous methods in android AsyncTask ( that today is not used too much because of RXJAVA, not to mention the Google Architecture components), you can find thousands of examples searching for this term, and the best way to understand and never forget anymore the meaning of the three dots is that they express a ...doubt... just like in the common language. Namely it is not clear the number of parameters that have to be passed, could be 0, could be 1 could be more( an array)...

这个特性叫做可变参数,是Java 5中引入的一个特性。这意味着函数可以接收多个String参数:

myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array

然后,你可以使用String变量作为数组:

public void myMethod(String... strings) {
    for (String whatever : strings) {
        // do what ever you want
    }

    // the code above is equivalent to
    for (int i = 0; i < strings.length; i++) {
        // classical for. In this case you use strings[i]
    }
}

这个答案很大程度上借鉴了kiswa和Lorenzo的……也来自Graphain的评论。

这意味着零个或多个String对象(或它们的单个数组)可以作为该方法的参数传递。

参见“任意数量的参数”部分:http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

在你的例子中,你可以这样调用它:

myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});

重要提示:以这种方式传递的参数始终是一个数组——即使只有一个。确保在方法体中也这样对待它。

重要说明2:获取…必须是方法签名中的最后一个。myMethod(int i, String…字符串)是好的,但myMethod(字符串…字符串,int i)是不行的。

感谢Vash在评论中的澄清。

这是Java传递变量(可变数量参数)的方法。

如果你熟悉C语言,这类似于…语法使用它的printf函数:

int printf(const char * format, ...);

但是以一种类型安全的方式:每个参数都必须符合指定的类型(在您的示例中,它们都应该是String)。

这是一个如何使用可变参数的简单示例:

class VarargSample {

   public static void PrintMultipleStrings(String... strings) {
      for( String s : strings ) {
          System.out.println(s);
      }
   }

   public static void main(String[] args) {
      PrintMultipleStrings("Hello", "world");
   }
}

…参数实际上是一个数组,所以你可以传递一个String[]作为参数。

同样为了说明一些问题,重要的是要知道var-arg参数被限制为一个,你不能有多个var-art参数。例如,这是非法的:

public void myMethod(String... strings, int ... ints){
// method body
}