corejava11(5.5 参数个数可变的方法)

5.5 参数个数可变的方法

可以提供可以用可变数量的参数调用的方法。(这些方法有时称为“varargs”方法。)

您已经看到这样一种方法:printf。例如,调用

System.out.printf("%d", n);

以及

System.out.printf("%d %s", n, "widgets");

两个调用相同的方法,即使一个调用有两个参数,另一个调用有三个参数。

printf方法的定义如下:

public class PrintStream
{
    public PrintStream printf(String fmt, Object... args) { return format(format, args); }
}

这里,省略号…是Java代码的一部分。它表示该方法可以接收任意数量的对象(除了fmt参数)。

printf方法实际上接收两个参数:格式字符串和一个包含所有其他参数的Object[]数组。(如果调用者提供整数或其他基元类型的值,自动装箱将其转换为对象。)现在它面临着扫描fmt字符串并将第i个格式说明符与值args[i]匹配的不可执行任务。

换句话说,对于printf的实现者,Object…参数类型与Object[]完全相同。

编译器需要将每个调用转换为printf,将参数绑定到数组中,并根据需要自动装箱:

System.out.printf("%d %s", new Object[] { new Integer(n), "widgets" } );

可以使用变量参数定义自己的方法,还可以为参数指定任何类型,甚至是基元类型。下面是一个简单的例子:一个计算变量值最大值的函数。

public static double max(double... values)
{
    double largest = Double.NEGATIVE_INFINITY;
    for (double v : values) if (v > largest) largest = v;
    return largest;
}

仅仅像这样调用函数:

double m = max(3.1, 40.4, -5);

编译器将new double[] { 3.1, 40.4, -5 }传递给max函数。

注意

将数组作为带有可变参数的方法的最后一个参数传递是合法的。例如:

System.out.printf("%d %s", new Object[] { new Integer(1), "widgets" } );

因此,可以将最后一个参数为数组的现有函数重新定义为具有可变参数的方法,而不必破坏任何现有代码。例如,MessageFormat.format在Java 5中以这种方式被增强。如果您愿意,甚至可以将主方法声明为

public static void main(String... args)

猜你喜欢

转载自blog.csdn.net/nbda1121440/article/details/90684961
今日推荐