java 三个点_Java,参数中的3个点
是瓦拉格斯?:)
varargs是可變長(zhǎng)度參數(shù)的縮寫,它允許方法接受可變數(shù)量的參數(shù)(0或更多)。使用varargs,創(chuàng)建需要使用可變數(shù)量參數(shù)的方法變得非常簡(jiǎn)單。在Java 5中添加了變量參數(shù)的特性。
varargs語法
在數(shù)據(jù)類型之后,一個(gè)vararg由三個(gè)省略號(hào)(三個(gè)點(diǎn))組成,其一般形式是return_type?method_name(data_type?...?variableName){}
對(duì)靜脈曲張的需求
在Java 5之前,如果需要可變數(shù)量的參數(shù),有兩種方法來處理
如果一個(gè)方法可以接受的參數(shù)的最大值很小且已知,則可以創(chuàng)建該方法的重載版本。如果方法可以使用的參數(shù)的最大數(shù)量很大或/且未知,則方法是將這些參數(shù)放入數(shù)組中,并將它們傳遞給以數(shù)組為參數(shù)的方法。這兩種方法都很容易出錯(cuò)-每次都要構(gòu)造一個(gè)參數(shù)數(shù)組,而且很難維護(hù)-因?yàn)樘砑有碌膮?shù)可能會(huì)導(dǎo)致編寫一個(gè)新的重載方法。
靜脈曲張的優(yōu)點(diǎn)
提供了一個(gè)簡(jiǎn)單得多的選擇。減少代碼,因?yàn)椴恍枰帉懼剌d的方法。
靜脈曲張的例子public?class?VarargsExample?{
public?void?displayData(String?...?values){
System.out.println("Number?of?arguments?passed?"?+?values.length);
for(String?s?:?values){
System.out.println(s?+?"?");
}
}
public?static?void?main(String[]?args)?{
VarargsExample?vObj?=?new?VarargsExample();
//?four?args
vObj.displayData("var",?"args",?"are",?"passed");
//three?args
vObj.displayData("Three",?"args",?"passed");
//?no-arg
vObj.displayData();
}}OutputNumber?of?arguments?passed?4var
args
are
passed
Number?of?arguments?passed?3Three?args
passed
Number?of?arguments?passed?0
從程序中可以看出,這里使用長(zhǎng)度來查找傳遞給該方法的參數(shù)。這是可能的,因?yàn)関arargs被隱式地作為數(shù)組傳遞。任何作為varargs傳遞的參數(shù)都存儲(chǔ)在一個(gè)數(shù)組中,該數(shù)組通過給varargs的名稱來引用。在這個(gè)程序中,數(shù)組名是值。還請(qǐng)注意,方法是以不同數(shù)量的參數(shù)調(diào)用的,首先調(diào)用四個(gè)參數(shù),然后調(diào)用三個(gè)參數(shù),然后調(diào)用零參數(shù)。所有這些調(diào)用都由使用varargs的相同方法處理。
帶靜脈曲張的限制
可以在方法中使用varargs參數(shù)的其他參數(shù),但是在這種情況下,varargs參數(shù)必須是該方法聲明的最后一個(gè)參數(shù)。void?displayValues(int?a,?int?b,?int?…?values)?//?OK
void?displayValues(int?a,?int?b,?int?…?values,?int?c)?//?compiler?error
varargs的另一個(gè)限制是必須只有一個(gè)varargs參數(shù)。void?displayValues(int?a,?int?b,?int?…?values,?int?…?moreValues)?//?Compiler?error
超負(fù)荷varargs方法
可以重載接受varargs參數(shù)的方法。Varargs方法可以通過-
其vararg參數(shù)的類型可能不同。通過添加其他參數(shù)。超負(fù)荷varargs方法實(shí)例public?class?OverloadingVarargsExp?{
//?Method?which?has?string?vararg?parameter
public?void?displayData(String?...?values){
System.out.println("Number?of?arguments?passed?"?+?values.length);
for(String?s?:?values){
System.out.println(s?+?"?");
}
}
//?Method?which?has?int?vararg?parameter
public?void?displayData(int?...?values){
System.out.println("Number?of?arguments?passed?"?+?values.length);
for(int?i?:?values){
System.out.println(i?+?"?");
}
}
//?Method?with?int?vararg?and?one?more?string?parameter
public?void?displayData(String?a,?int?...?values){
System.out.println("?a?"?+?a);
System.out.println("Number?of?arguments?passed?"?+?values.length);
for(int?i?:?values){
System.out.println(i?+?"?");
}
}
public?static?void?main(String[]?args)?{
OverloadingVarargsExp?vObj?=?new?OverloadingVarargsExp();
//?four?string?args
vObj.displayData("var",?"args",?"are",?"passed");
//?two?int?args
vObj.displayData(10,?20);
//?One?String?param?and?two?int?args
vObj.displayData("Test",?20,?30);
}}OutputNumber?of?arguments?passed?4var
args
are
passed
Number?of?arguments?passed?210?20
a?TestNumber?of?arguments?passed?220?30
Varargs與超載歧義
在某些情況下,當(dāng)我們有重載varargs方法時(shí),調(diào)用可能是模棱兩可的。讓我們看看一個(gè)例子public?class?OverloadingVarargsExp?{
//?Method?which?has?string?vararg?parameter
public?void?displayData(String?...?values){
System.out.println("Number?of?arguments?passed?"?+?values.length);
for(String?s?:?values){
System.out.println(s?+?"?");
}
}
//?Method?which?has?int?vararg?parameter
public?void?displayData(int?...?values){
System.out.println("Number?of?arguments?passed?"?+?values.length);
for(int?i?:?values){
System.out.println(i?+?"?");
}
}
public?static?void?main(String[]?args)?{
OverloadingVarargsExp?vObj?=?new?OverloadingVarargsExp();
//?four?string?args
vObj.displayData("var",?"args",?"are",?"passed");
//?two?int?args
vObj.displayData(10,?20);
//?This?call?is?ambiguous
vObj.displayData();
}}
在這個(gè)程序中,當(dāng)我們?cè)跊]有任何參數(shù)的情況下調(diào)用Displaydata()方法時(shí),它會(huì)拋出錯(cuò)誤,因?yàn)榫幾g器不確定此方法調(diào)用是否用于displayData(String ... values)或displayData(int ... values)
如果我們有重載方法,其中一個(gè)方法具有vararg方法的一種類型,另一種方法有一個(gè)參數(shù),vararg參數(shù)的類型相同,那么我們也有歧義-作為Exp-displayData(int ... values)和displayData(int a, int ... values)
這兩個(gè)重載的方法總是有歧義的。
總結(jié)
以上是生活随笔為你收集整理的java 三个点_Java,参数中的3个点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划算法之数塔问题
- 下一篇: poi 不自动计算 设置单元格公式_Ja