专业的JAVA编程教程与资源

网站首页 > java教程 正文

java 核心技术-12版 卷Ⅰ- 5.5参数个数可变的方法

temp10 2024-11-06 12:14:08 java教程 11 ℃ 0 评论

原文

5.5参数个数可变的方法

可以提供参数个数可变的方法(有时,这些方法被称为“变参”(varargs) 方法)前面已经看到过这样一个方法:printf。例如,下而的方法调用:

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

java 核心技术-12版 卷Ⅰ- 5.5参数个数可变的方法

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

?这两条语句都调用同一个方法,不过,一个调用有2个参数,另一个调用有3个参数。

printf方法是这样定义的

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

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

?实际上,printf方法接收两个参数,一个是格式字符串,另一个是 Object[] 数组,其中保存着所有其他参数(如果调用者提供的是整数或者其他基本类型的值,则会把它们自动装箱为对象)。现在,不可避免地要扫描 fmt 字符申,并将第 i 个格式说明符与 args[i] 的值匹配。

?换句话说,对于printf 的实现者来说,object... 参数类型与 object[] 完全一样。

?编译器需要转换每个printf 调用,将参数打包到一个数组中,并根据需要自动装箱:

?System.out.printf("%d %s", new Object[] ( Integer.value0f(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[]{Integer.valueOf( i ), "widgets"})

?因此,如果一个已有函数的最后一个参数是数组,则可以把它重新定义为有可变参数的方法,而不会破坏任何已有的代码。例如,Java5中就采用这种方式增强了MessageFormat.format。如果愿意,甚至可以将main 方法声明为以下形式:

public static void main(String... args)


?

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表