参数数量可变的方法

在Java SE 5.0以前的版本中,每个Java方法都有固定数量的参数。然而,现在的版本提供了可以用可变的参数数量调用的方法(有时
称为“变参”方法)。

前面已经看到过这样的方法:printf。例如,下面的方法调用:

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

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

在上面两条语句中,尽管一个调用包含两个参数,另一个调用包含三个参数,但它们调用的都是同一个方法。

printf方法是这样定义的:

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

这里的省略号...是Java代码的一部分,它表明这个方法可以接受任意数量的对象(除format参数之外)。

实际上,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.MIN_VALUE;
	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(n), "widgets"});

因此,可以将已存在且最后一个参数是是数组的方法重新定义为...而不会破坏任何已存在的代码。

编译执行下面的测试程序,运行结果见图1。

public class tt
{
	public static double max(double... values)
	{
		double largest = Double.MIN_VALUE;
		for(double v : values)
			if(v > largest)
				largest = v;
		return largest;
	}
	
	public static void main(String... args)
	{
		System.out.println("max1=============");
		double max1 = max(1.0, -44.1, 4.5, 4.8);
		System.out.println(max1);
		
		System.out.println("max2=============");
		double[] max2 = new double[]{1.0, -4.1, 4.5, 4.8};
		System.out.println(max(max2));
	}
}

                                                                                                   图1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值