Java变量号或方法的参数


146

是否可以声明允许可变数量的参数的方法?

定义中使用的表示该方法应允许使用可变数量参数的符号含义是什么?

答案: varargs


11
自完成作业以来,我们不想知道您的问题,我们只是想知道您正在学习。
HDave

Answers:


274

没错 您可以在Oracle varargs指南中找到有关它的更多信息。

这是一个例子:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

可以称为

foo("foo"); // Single arg.
foo("foo", "bar"); // Multiple args.
foo("foo", "bar", "lol"); // Don't matter how many!
foo(new String[] { "foo", "bar" }); // Arrays are also accepted.
foo(); // And even no args.

1
是否可以进行各种类型的参数设置?例如(String ... strs,int ... ints)。那么,任何类型的参数以什么顺序排列呢?
trusktr

5
@trusktr:如果您想要任何对象,请使用Object...
BalusC

2
@trusktr不,基元不是对象。有区别的很好的解释在这里:programmerinterview.com/index.php/java-questions/...
迪克·卢卡斯

5
@Richard:Object... args由于autoboxing,使用将可与基元一起使用。
Sumit

1
@StevenVascellaro:我假设参数像数组一样处理,所以您可能只需做一下即可varargs.length
LMD

15
Variable number of arguments

可以将可变数量的参数传递给方法。但是,有一些限制:

  • 可变数量的参数必须全部为同一类型
  • 在方法中将它们视为数组
  • 它们必须是方法的最后一个参数

要了解这些限制,请在下面的代码片段中考虑用于返回整数列表中最大的整数的方法:

private static int largest(int... numbers) {
     int currentLargest = numbers[0];
     for (int number : numbers) {
        if (number > currentLargest) {
            currentLargest = number;
        }
     }
     return currentLargest;
}

资料来源2012年Oracle认证Java SE 7助理程序员学习指南


14

是的,有可能:

public void myMethod(int... numbers) { /* your code */ }

10

对于不同类型的参数,有3点

public void foo(Object... x) {
    String myVar1  = x.length > 0 ? (String)x[0]  : "Hello";
    int myVar2     = x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
} 

然后叫它

foo("Hii"); 
foo("Hii", 146); 

为了安全起见,请像这样使用:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

这种方法的主要缺点是,如果可选参数的类型不同,则会丢失静态类型检查。请查看更多变化



0

是的,Java允许vargs使用方法参数。

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.