生活随笔
收集整理的這篇文章主要介紹了
Java不定参数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
先看兩個(gè)簡(jiǎn)單的例子,來感受一下Java的不定長(zhǎng)度參數(shù)?
第一個(gè)例子:?
Java代碼??
public?class?VariArgs?{????????public?static?void?main(String[]?args)?{??????????test();??????????test("aaa");??????????test("aaa",?"bbb");??????????test("aaa",?"bbb",?"ccc");??????}????????public?static?void?test(String...?args)?{??????????System.out.println(args.getClass());??????????for?(String?arg?:?args)?{??????????????System.out.println(arg);??????????}??????}??}??
第二個(gè)例子:?
Java代碼??
public?class?VariArgs?{????????public?static?void?main(String[]?args)?{??????????test("aaa");??????????test("aaa",?"bbb");??????????test("aaa",?"bbb",?"ccc");??????}????????public?static?void?test(String?arg,?String...?args)?{??????????System.out.println(arg);??????????System.out.println("----------------");??????????for?(String?s?:?args)?{??????????????System.out.println(s);??????????}??????}??}??
?? 讀者可以自己運(yùn)行一下,這個(gè)不定長(zhǎng)度參數(shù)的類型為String[],即字符串?dāng)?shù)組。?
從上面可以看出,如果一個(gè)方法的參數(shù)定為不定參數(shù)的話,這個(gè)參數(shù)可以根據(jù)參數(shù)個(gè)數(shù)動(dòng)態(tài)生成一個(gè)數(shù)組,然后傳入方法執(zhí)行。?
??? 不過,不定參數(shù)有兩個(gè)規(guī)定:第一,方法的參數(shù)列表中最多只有一個(gè)不定長(zhǎng)度的參數(shù);第二,就是不定長(zhǎng)度的數(shù)組的位置必須是最后一個(gè)參數(shù)。不然不能通過編譯。?
??? 對(duì)于第一個(gè)規(guī)定,是因?yàn)槿绻卸嘤谝粋€(gè)不定長(zhǎng)度的參數(shù),當(dāng)真正調(diào)用這個(gè)方法的時(shí)候,JVM、將不知道前面的不定長(zhǎng)度參數(shù)有多長(zhǎng), 下一個(gè)參數(shù)是從哪里開始.?
??? 對(duì)于第二個(gè)參數(shù)也是一樣,編譯器不知道不定長(zhǎng)度參數(shù)的長(zhǎng)度,無法確定從哪里開始下一個(gè)參數(shù)。?
??? 以下是幾種不正確使用不定長(zhǎng)度參數(shù)的例子,請(qǐng)不要這樣寫程序:?
Java代碼??
public?static?void?test(Object...?objs,?Object?obj);????public?static?void?test(Object?obj1,?Object...?objs,?Object?obj2);????public?static?void?test(Object...?objs1,?Object...?objs2);??
?? 不定參數(shù)的方法可以重載。(大家都知道,重載就是方法名相同,而方法的參數(shù)列表不同)?
?? 下面給出重載的示例:?
Java代碼??
public?class?VariArgs?{????????public?static?void?main(String[]?args)?{??????????test("aaa");??????????test("aaa",?"bbb");??????????test("aaa",?"bbb",?"ccc");??????}????????public?static?void?test(Object...?args)?{??????}????????public?static?void?test(String?arg,?String...?args)?{??????}??}??
?? 讀者如果細(xì)心的話,可以看出文章開頭給出的兩個(gè)例子的區(qū)別,就是第二個(gè)例子比第一個(gè)例子的test方法的參數(shù)多出了一個(gè)String arg,從感覺上沒有太大的區(qū)別,這有點(diǎn)像編譯原理的*和+的區(qū)別。第一個(gè)test方法指可以有0或N個(gè)String做參數(shù),但第二個(gè)test方法指至少一個(gè)String做為參數(shù)。?
?? 然后結(jié)合重載來看,把第一個(gè)例子和第二個(gè)例子合并成一個(gè)類,得到以下代碼:?
Java代碼??
public?class?VariArgs?{????????public?static?void?main(String[]?args)?{??????????test();??????????test("aaa");??????????test("aaa",?"bbb");??????????test("aaa",?"bbb",?"ccc");??????}????????public?static?void?test(String...?args)?{??????????System.out.println(args.getClass());??????????for?(String?arg?:?args)?{??????????????System.out.println(arg);??????????}??????}????????public?static?void?test(String?arg,?String...?args)?{??????????System.out.println(arg);??????????System.out.println("----------------");??????????for?(String?s?:?args)?{??????????????System.out.println(s);??????????}??????}??}??
??? 讀者可以編譯下這個(gè)程序,結(jié)果是編譯不通過。為什么呢?程序編譯到第五行時(shí),不能確定test("aaa")該用第10行的test方法還是第17行的方法,因?yàn)閮蓚€(gè)方法都可以有相同的參數(shù)列表。都能精確匹配上參數(shù)列表,編譯器在這種情況下只好報(bào)出編譯不能通過的錯(cuò)誤。所以在重載這樣的方法時(shí),注意參數(shù)列表,不要使兩個(gè)方法可以有同樣的參數(shù)列表。
總結(jié)
以上是生活随笔為你收集整理的Java不定参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。