關(guān)于java的可變參數(shù)列表
1.簡介:
java的可變參數(shù)列表是的從jdk1.5開始新增的,其英文名詞varargs
參看:New Features and Enhancements J2SE 5.0
2.作用
可以傳未知個數(shù)的參數(shù),無需手動將參數(shù)列表裝入數(shù)組
參看:Varargs
3.語法
//可變參數(shù)列表的varname被編譯后其實是一個數(shù)組來的
anymethod(typename ... varname){}
4.簡單例子
? 可以傳很多個參數(shù),也可以不傳參數(shù)台猴。某種意義上說還可以減少方法的重載。
public class Test {
public static void varArgs(int ... numbers){
//numbers其實是數(shù)組,它有l(wèi)ength屬性椅文,numbers.length可以獲取它的參數(shù)個數(shù);可以用下標(biāo)訪問值惜颇,比如number[0]皆刺,當(dāng)然這是要number.lenth>0時候才可以訪問的。
for(int s: numbers){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
varArgs();
varArgs(1,2);
varArgs(1,2,3,4,5,6);
}
}
輸出結(jié)果是:
1,2,
1,2,3,4,5,6,
? 這種寫法挺酷的凌摄。當(dāng)然用數(shù)組也可以實現(xiàn)羡蛾,不過會多幾個步驟,需要方法重載無參數(shù)的情況锨亏,另外使用的時候也需要創(chuàng)建一個數(shù)組痴怨,會比可變參數(shù)列表的寫法多些代碼。
代碼如下:
public class Test {
public static void varArgs(){
System.out.println();
}
public static void varArgs(int[]numbers){
for(int s: numbers){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
varArgs();
varArgs(new int[]{1,2});
varArgs(new int[]{1,2,3,4,5,6});
}
}
? 顯然器予,可變參數(shù)列表的寫法舒服浪藻、簡潔些,看起來也高級些乾翔。
5.注意事項
//1.可變參數(shù)列表一定是在最后的
public void test(int ... num,double n)//是錯誤的
public void test(double n,int ... num)//是正確的
//2.每個方法最多只有一個可變參數(shù)列表
6.結(jié)合泛化
? 有時候我們使用泛化還可以讓參數(shù)變得更加靈活些爱葵,讓參數(shù)類型有更多選擇。
比如
public class Test {
public static <E>void varArgs(E ... arg){
for(E s: arg){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
varArgs(11.1,2.3,0.4);
varArgs(1,2,3,4,5,6);
varArgs("hi","hello");
}
}
輸出
11.1,2.3,0.4,
1,2,3,4,5,6,
hi,hello,
? 注意在這里末融,如果要像之前那樣用數(shù)組改寫會有所不同钧惧,在可變參數(shù)列表中這里的泛化的每個參數(shù)不一定需要統(tǒng)一類型,如下面的
public class Test {
public static <E>void varArgs(E ... arg){
for(E s: arg){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
//下面的調(diào)用時是可運行的
varArgs("hi",1,new double[]{});
}
}
? 其實勾习,上面的泛化相當(dāng)于參數(shù)就是Object類型
public class Test {
public static void varArgs(Object ... arg){
for(Object s: arg){
System.out.print(s+",");
}
System.out.println();
}
public static void main(String arg[]){
//下面的調(diào)用時是可運行的
varArgs("hi",1,new double[]{});
}
}
7.典型的應(yīng)用
比如java的System.out.printf()方法
//前面的第一個參數(shù)是格式字符串浓瞪,后面的參數(shù)就是可變參數(shù)列表
System.out.printf("%s,%d/%d/%d","cendeal",2019,3,17);
下面是其源碼定義
//System是java的類,out是System類的類成員巧婶,out是PrintStream對象乾颁,printf()是PrintStream的成員方法,所以訪問就是System.out.printf()
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable
{
//此處省略該類其他代碼
public PrintStream printf(String format, Object ... args) {
return format(format, args);
}
}