java 三个点_Java,参数中的3个点
是瓦拉格斯?:)
varargs是可變長度參數的縮寫,它允許方法接受可變數量的參數(0或更多)。使用varargs,創建需要使用可變數量參數的方法變得非常簡單。在Java 5中添加了變量參數的特性。
varargs語法
在數據類型之后,一個vararg由三個省略號(三個點)組成,其一般形式是return_type?method_name(data_type?...?variableName){}
對靜脈曲張的需求
在Java 5之前,如果需要可變數量的參數,有兩種方法來處理
如果一個方法可以接受的參數的最大值很小且已知,則可以創建該方法的重載版本。如果方法可以使用的參數的最大數量很大或/且未知,則方法是將這些參數放入數組中,并將它們傳遞給以數組為參數的方法。這兩種方法都很容易出錯-每次都要構造一個參數數組,而且很難維護-因為添加新的參數可能會導致編寫一個新的重載方法。
靜脈曲張的優點
提供了一個簡單得多的選擇。減少代碼,因為不需要編寫重載的方法。
靜脈曲張的例子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
從程序中可以看出,這里使用長度來查找傳遞給該方法的參數。這是可能的,因為varargs被隱式地作為數組傳遞。任何作為varargs傳遞的參數都存儲在一個數組中,該數組通過給varargs的名稱來引用。在這個程序中,數組名是值。還請注意,方法是以不同數量的參數調用的,首先調用四個參數,然后調用三個參數,然后調用零參數。所有這些調用都由使用varargs的相同方法處理。
帶靜脈曲張的限制
可以在方法中使用varargs參數的其他參數,但是在這種情況下,varargs參數必須是該方法聲明的最后一個參數。void?displayValues(int?a,?int?b,?int?…?values)?//?OK
void?displayValues(int?a,?int?b,?int?…?values,?int?c)?//?compiler?error
varargs的另一個限制是必須只有一個varargs參數。void?displayValues(int?a,?int?b,?int?…?values,?int?…?moreValues)?//?Compiler?error
超負荷varargs方法
可以重載接受varargs參數的方法。Varargs方法可以通過-
其vararg參數的類型可能不同。通過添加其他參數。超負荷varargs方法實例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與超載歧義
在某些情況下,當我們有重載varargs方法時,調用可能是模棱兩可的。讓我們看看一個例子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();
}}
在這個程序中,當我們在沒有任何參數的情況下調用Displaydata()方法時,它會拋出錯誤,因為編譯器不確定此方法調用是否用于displayData(String ... values)或displayData(int ... values)
如果我們有重載方法,其中一個方法具有vararg方法的一種類型,另一種方法有一個參數,vararg參數的類型相同,那么我們也有歧義-作為Exp-displayData(int ... values)和displayData(int a, int ... values)
這兩個重載的方法總是有歧義的。
總結
以上是生活随笔為你收集整理的java 三个点_Java,参数中的3个点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划算法之数塔问题
- 下一篇: poi 不自动计算 设置单元格公式_Ja