java可变参数.doc

上传人:re****.1 文档编号:559841539 上传时间:2023-06-23 格式:DOC 页数:4 大小:27.01KB
返回 下载 相关 举报
java可变参数.doc_第1页
第1页 / 共4页
java可变参数.doc_第2页
第2页 / 共4页
java可变参数.doc_第3页
第3页 / 共4页
java可变参数.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《java可变参数.doc》由会员分享,可在线阅读,更多相关《java可变参数.doc(4页珍藏版)》请在金锄头文库上搜索。

1、java可变参数.txt14热情是一种巨大的力量,从心灵内部迸发而出,激励我们发挥出无穷的智慧和活力;热情是一根强大的支柱,无论面临怎样的困境,总能催生我们乐观的斗志和顽强的毅力没有热情,生命的天空就没的色彩。深入了解JAVA可变长度的参数(Varargs)(2010-01-14 22:06:57)转载标签: it 分类: java 到J2SE 1.4为止,一直无法在Java程序里定义实参个数可变的方法因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了。尽管可以通过重载机制,为同一个方法提供带有不同数量

2、的形参的版本,但是这仍然不能达到让实参数量任意变化的目的。然而,有些方法的语义要求它们必须能接受个数可变的实参例如著名的main方法,就需要能接受所有的命令行参数为实参,而命令行参数的数目,事先根本无法确定下来。 对于这个问题,传统上一般是采用“利用一个数组来包裹要传递的实参”的做法来应付。 1. 用数组包裹实参“用数组包裹实参”的做法可以分成三步:首先,为这个方法定义一个数组型的参数;然后在调用时,生成一个包含了所有要传递的实参的数组;最后,把这个数组作为一个实参传递过去。这种做法可以有效的达到“让方法可以接受个数可变的参数”的目的,只是调用时的形式不够简单。J2SE 1.5中提供了Vara

3、rgs机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。Varargs的含义大体说来,“Varargs”是“variable number of arguments”的意思。有时候也被简单的称为“variable arguments”,不过因为这一种叫法没有说明是什么东西可变,所以意义稍微有点模糊。 2. 定义实参个数可变的方法只要在一个形参的“类型”与“参数名”之间加上三个连续的“.”(即“.”,英文里的句中省略号),就可以让它和不确定个实参相匹配。而一个带有这样的形参的方法,就是一个实参个数可变的方法。清单1:一个实参个数可变的方法privat

4、e static int sumUp(int. values) 注意,只有最后一个形参才能被定义成“能和不确定个实参相匹配”的。因此,一个方法里只能有一个这样的形参。另外,如果这个方法还有其它的形参,要把它们放到前面的位置上。编译器会在背地里把这最后一个形参转化为一个数组形参,并在编译出的class文件里作上一个记号,表明这是个实参个数可变的方法。清单2:实参个数可变的方法的秘密形态private static int sumUp(int values) 由于存在着这样的转化,所以不能再为这个类定义一个和转化后的方法签名一致的方法。清单3:会导致编译错误的组合private static in

5、t sumUp(int. values) private static int sumUp(int values) 3. 调用实参个数可变的方法只要把要传递的实参逐一写到相应的位置上,就可以调用一个实参个数可变的方法。不需要其它的步骤。清单4:可以传递若干个实参sumUp(1, 3, 5, 7);在背地里,编译器会把这种调用过程转化为用“数组包裹实参”的形式:清单5:偷偷出现的数组创建sumUp(new int1, 2, 3, 4);另外,这里说的“不确定个”也包括零个,所以这样的调用也是合乎情理的:清单6:也可以传递零个实参sumUp();这种调用方法被编译器秘密转化之后的效果,则等同于这样

6、:清单7:零实参对应空数组sumUp(new int);注意这时传递过去的是一个空数组,而不是null。这样就可以采取统一的形式来处理,而不必检测到底属于哪种情况。4. 处理个数可变的实参处理个数可变的实参的办法,和处理数组实参的办法基本相同。所有的实参,都被保存到一个和形参同名的数组里。根据实际的需要,把这个数组里的元素读出之后,要蒸要煮,就可以随意了。 清单8:处理收到的实参们private static int sumUp(int. values) int sum = 0; for (int i = 0; i values.length; i+) sum += valuesi; retu

7、rn sum; 5. 转发个数可变的实参有时候,在接受了一组个数可变的实参之后,还要把它们传递给另一个实参个数可变的方法。因为编码时无法知道接受来的这一组实参的数目,所以“把它们逐一写到该出现的位置上去”的做法并不可行。不过,这并不意味着这是个不可完成的任务,因为还有另外一种办法,可以用来调用实参个数可变的方法。在J2SE 1.5的编译器的眼中,实参个数可变的方法是最后带了一个数组形参的方法的特例。因此,事先把整组要传递的实参放到一个数组里,然后把这个数组作为最后一个实参,传递给一个实参个数可变的方法,不会造成任何错误。借助这一特性,就可以顺利的完成转发了。清单9:转发收到的实参们public

8、 class PrintfSample public static void main(String args) printOut(Pi:%f E:%fn, Math.PI, Math.E); private static void printOut(String format, Object. args) System.out.printf(format, args); 6. 是数组?不是数组?尽管在背地里,编译器会把能匹配不确定个实参的形参,转化为数组形参;而且也可以用数组包了实参,再传递给实参个数可变的方法;但是,这并不表示“能匹配不确定个实参的形参”和“数组形参”完全没有差异。一个明显

9、的差异是,如果按照调用实参个数可变的方法的形式,来调用一个最后一个形参是数组形参的方法,只会导致一个“cannot be applied to”的编译错误。清单10:一个“cannot be applied to”的编译错误private static void testOverloading(int i) System.out.println(A);public static void main(String args) testOverloading(1, 2, 3);/编译出错由于这一原因,不能在调用只支持用数组包裹实参的方法的时候(例如在不是专门为J2SE 1.5设计第三方类库中遗留的那些),直接采用这种简明的调用方式。如果不能修改原来的类,为要调用的方法增加参数个数可变的版本,而又想采用这种简明的调用方式,那么可以借助“引入外加函数(Introduce Foreign Method)”和“引入本地扩展(Intoduce Local Extension)”的重构手法来近似的达到目的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号