站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题J2SE5.0 实例---变长参数

J2SE5.0 实例---变长参数

摘要: J2SE5.0 实例---变长参数

变长参数(Varargs)

与泛型一样,变长参数是C++中有而Java中没有的一种语言特性,在过去如果我们想向一个函数传递可变数量的函数,就必须首先将这些参数放入一个数组中,然后将数组传递给函数。就如同下面所作的一样:

<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: silver; MARGIN: auto auto auto 59.4pt; BORDER-LEFT: medium none; WIDTH: 378pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 480; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="504" border="1"><tr style="mso-yfti-irow: 0; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 378pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="504">

Object[] arguments = { 640, "kb", "anybody", "Bill Gates" };

String result = MessageFormat.format(

"{3}:{0,number,integer}{1} ought to be enough for {2} ",

arguments);

</td></tr></table>

在J2SE5.0中,参数仍然是被放入一个数组中传给对应的方法,但是不同的是,你不再需要手动的创建数组,而是只需要将那些参数罗列出来,其他的工作由虚拟机替你完成。所以现在我们可以这样写:

<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: silver; MARGIN: auto auto auto 59.4pt; BORDER-LEFT: medium none; WIDTH: 378pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 480; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="504" border="1"><tr style="mso-yfti-irow: 0; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 378pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="504">

String result = MessageFormat.format(

"{3}:{0,number,integer}{1} ought to be enough for {2} ",

640, "kb", "anybody", "Bill Gates");

</td></tr></table>

我们通过一个示例函数来说明使用变长参数函数的定义。这个函数打印出一个人养的几条狗的名字。

<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: silver; MARGIN: auto auto auto 59.4pt; BORDER-LEFT: medium none; WIDTH: 378pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 480; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="504" border="1"><tr style="mso-yfti-irow: 0; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 378pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="504">

private void printDogNames(String... dogs)

{

System.out.println("I have " + dogs.length + " dogs:");

for(String dogname:dogs)

{

System.out.println(dogname);

}

}

</td></tr></table>

事实上变长参数dogs是一个数组。

一个函数的参数中只能有一个变长参数,所以类似下面的定义是不合法的:

<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: silver; MARGIN: auto auto auto 59.4pt; BORDER-LEFT: medium none; WIDTH: 378pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 480; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="504" border="1"><tr style="mso-yfti-irow: 0; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 378pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="504">

private void printDogNames(String... dogs,float... dogage)

</td></tr></table>

如果决定把函数参数设置为可变长度的,你必须想到这样一种情况,就是调用的程序很可能会不给你传任何的参数,这个时候作为参数的数组length为0,而这在语法上是完全合法的,所以你必须在函数定义中考虑到这种情况。




↑返回目录
前一篇: J2SE 5.0实例---静态引入
后一篇: J2SE 5.0实例---原生类型的autoboxing和auto-unboxing