网站首页 > java教程 正文
原文
5.5参数个数可变的方法
可以提供参数个数可变的方法(有时,这些方法被称为“变参”(varargs) 方法)前面已经看到过这样一个方法:printf。例如,下而的方法调用:
System.out.println("%d" ,n);
和
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)
?
猜你喜欢
- 2024-11-06 35个编码小细节,助你有效提升Java代码的执行效率!网友:学到了
- 2024-11-06 35个Java 代码优化细节(seo 代码优化)
- 2024-11-06 Java 性能优化:35 个小细节,提升你的 Java 代码运行效率
- 2024-11-06 二十二、Java中的函数与方法(java 函数)
- 2024-11-06 java高级用法之:JNA类型映射应该注意的问题
- 2024-11-06 最全面的44个Java性能调优细节(四个全面中哪个最具有基础性)
- 2024-11-06 尚学堂知识整理:java可变长度数组
- 2024-11-06 阿里强制要求的21条Java开发规范,可以避免很多坑
- 2024-11-06 面试题:为什么 Java 中的 String 被设计为不可变类?
- 2024-11-06 第五章:Java方法和参数传递(java中方法的参数传递是什么调用)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)