大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java使用可變長參數(shù)及注意事項

Java使用可變長參數(shù)及注意事項

更新時間:2020-06-01 16:30:48 來源:動力節(jié)點 瀏覽2233次

在Java5中提供了變長參數(shù)(varargs),也就是在方法定義中可以使用個數(shù)不確定的參數(shù),對于同一方法可以使用不同個數(shù)的參數(shù)調(diào)用,例如print("hello");print("hello","lisi");print("hello","張三","alexia");下面介紹如何定義可變長參數(shù)以及如何使用可變長參數(shù)。

Java使用可變長參數(shù)及注意事項

1.可變長參數(shù)的定義

使用...表示可變長參數(shù),例如

print(String...?args){
??...
}

在具有可變長參數(shù)的方法中可以把參數(shù)當(dāng)成數(shù)組使用,例如可以循環(huán)輸出所有的參數(shù)值。

print(String...?args){
???for(String?temp:args)
??????System.out.println(temp);
}

2.可變長參數(shù)的方法的調(diào)用

調(diào)用的時候可以給出任意多個參數(shù)也可不給參數(shù),例如:

print();
print("hello");
print("hello","lisi");
print("hello","張三",?"alexia")

3.可變長參數(shù)的使用規(guī)則

(1)在調(diào)用方法的時候,如果能夠和固定參數(shù)的方法匹配,也能夠與可變長參數(shù)的方法匹配,則選擇固定參數(shù)的方法。看下面代碼的輸出:

package?com;
//?這里使用了靜態(tài)導(dǎo)入
import?static?java.lang.System.out;
public?class?VarArgsTest?{
????public?void?print(String...?args)?{
????????for?(int?i?=?0;?i?<?args.length;?i++)?{
????????????out.println(args[i]);
????????}
????}
????public?void?print(String?test)?{
????????out.println("----------");
????}

????public?static?void?main(String[]?args)?{
????????VarArgsTest?test?=?new?VarArgsTest();
????????test.print("hello");
????????test.print("hello",?"alexia");
????}
}

(2)如果要調(diào)用的方法可以和兩個可變參數(shù)匹配,則出現(xiàn)錯誤,例如下面的代碼:

package?com;
//?這里使用了靜態(tài)導(dǎo)入
import?static?java.lang.System.out;
public?class?VarArgsTest1?{
????public?void?print(String...?args)?{
????????for?(int?i?=?0;?i?<?args.length;?i++)?{
????????????out.println(args[i]);
????????}
????}
????public?void?print(String?test,String...args?){
??????????out.println("----------");
????}
????public?static?void?main(String[]?args)?{
????????VarArgsTest1?test?=?new?VarArgsTest1();
????????test.print("hello");
????????test.print("hello",?"alexia");
????}
}

對于上面的代碼,main方法中的兩個調(diào)用都不能編譯通過,因為編譯器不知道該選哪個方法調(diào)用,如下所示:

Java使用可變長參數(shù)及注意事項

(3)一個方法只能有一個可變長參數(shù),并且這個可變長參數(shù)必須是該方法的最后一個參數(shù)

以下兩種方法定義都是錯誤的。

public void test(String...strings,ArrayList list){
}
public void test(String...strings,ArrayList...list){
}

4.可變長參數(shù)的使用規(guī)范

(1)避免帶有可變長參數(shù)的方法重載:如3.1中,編譯器雖然知道怎么調(diào)用,但人容易陷入調(diào)用的陷阱及誤區(qū)

(2)別讓null值和空值威脅到變長方法,如3.2中所示,為了說明null值的調(diào)用,重新給出一個例子:

package?com;public?class?VarArgsTest1?{
????public?void?print(String?test,?Integer...?is)?{??
????}
????public?void?print(String?test,String...args?){??????
????}
????public?static?void?main(String[]?args)?{
????????VarArgsTest1?test?=?new?VarArgsTest1();
????????test.print("hello");
????????test.print("hello",?null);
????}
}

Java使用可變長參數(shù)及注意事項

因為兩個方法都匹配,編譯器不知道選哪個,于是報錯了,這里同時還有個非常不好的編碼習(xí)慣,即調(diào)用者隱藏了實參類型,這是非常危險的,不僅僅調(diào)用者需要“猜測”該調(diào)用哪個方法,而且被調(diào)用者也可能產(chǎn)生內(nèi)部邏輯混亂的情況。對于本例來說應(yīng)該做如下修改:

public?static?void?main(String[]?args)?{
????VarArgsTest1?test?=?new?VarArgsTest1();
????String[]?strs?=?null;
?????test.print("hello",?strs);
?}

(3)覆寫變長方法也要循規(guī)蹈矩

下面看一個例子,大家猜測下程序能不能編譯通過:

package?com;
public?class?VarArgsTest2?{
????/**
?????*?@param?args
?????*/
????public?static?void?main(String[]?args)?{
????????//?TODO?Auto-generated?method?stub
????????//?向上轉(zhuǎn)型
????????Base?base?=?new?Sub();
????????base.print("hello");
????????
????????//?不轉(zhuǎn)型
????????Sub?sub?=?new?Sub();
????????sub.print("hello");
????}
}

//?基類
class?Base?{
????void?print(String...?args)?{
????????System.out.println("Base......test");
????}
}

//?子類,覆寫父類方法
class?Sub?extends?Base?{
????@Override
????void?print(String[]?args)?{
????????System.out.println("Sub......test");
????}
}

答案當(dāng)然是編譯不通過,是不是覺得很奇怪?

Java使用可變長參數(shù)及注意事項

第一個能編譯通過,這是為什么呢?事實上,base對象把子類對象sub做了向上轉(zhuǎn)型,形參列表是由父類決定的,當(dāng)然能通過。而看看子類直接調(diào)用的情況,這時編譯器看到子類覆寫了父類的print方法,因此肯定使用子類重新定義的print方法,盡管參數(shù)列表不匹配也不會跑到父類再去匹配下,因為找到了就不再找了,因此有了類型不匹配的錯誤。

這是個特例,覆寫的方法參數(shù)列表竟然可以與父類不相同,這違背了覆寫的定義,并且會引發(fā)莫名其妙的錯誤。

這里,總結(jié)下覆寫必須滿足的條件:

  • 重寫方法不能縮小訪問權(quán)限;
  • 參數(shù)列表必須與被重寫方法相同(包括顯示形式);
  • 返回類型必須與被重寫方法的相同或是其子類;
  • 重寫方法不能拋出新的異常,或者超過了父類范圍的異常,但是可以拋出更少、更有限的異常,或者不拋出異常。

最后,給出一個有陷阱的例子,大家應(yīng)該知道輸出結(jié)果:

package?com;
public?class?VarArgsTest?{
????public?static?void?m1(String?s,?String...?ss)?{
????????for?(int?i?=?0;?i?<?ss.length;?i++)?{
????????????System.out.println(ss[i]);
????????}
????}

????public?static?void?main(String[]?args)?{
????????m1("");
????????m1("aaa");
????????m1("aaa",?"bbb");
????}
}

以上就是動力節(jié)點java培訓(xùn)機構(gòu)的小編針對“Javaweb系統(tǒng)視頻之架構(gòu)演變”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 中文字幕曰韩一区二区不卡 | 黄动漫在线无限看免费 | 国产一区二三区 | 国产乱码一区二区三区 | 久草小区二区三区四区网页 | 国产精品久久久久久久久kt | 青青久 | 亚洲高清网站 | 玖玖免费| 伊人久久国产免费观看视频 | 97国产精品国产品国语字幕 | 四小虎免费永久观看 | 好看的中文字幕在线 | 免费一级毛片在线播放不收费 | 国产免费一级在线观看 | 亚洲欧美国产一区二区三区 | 色九九亚洲偷偷动态图 | 高清一区二区亚洲欧美日韩 | 大陆一级毛片免费视频观看i | 久久久日韩精品国产成人 | 国产成人一区二区三中文 | 最新国产精品亚洲二区 | 日韩国产欧美在线观看 | 狠狠色丁香婷婷久久 | 亚洲日本va中文字幕在线不卡 | 日韩成| 床上毛片 | 久久影视一区 | 欧美人与性动交α欧美精品图片 | 亚洲欧洲日韩在线 | 国产美女激情 | 亚洲欧洲一区二区三区在线观看 | 人人干视频在线观看 | 夜色资源网yese321 | 一区二区三区在线视频播放 | 一区二区免费在线观看 | 成人在线午夜 | 色婷婷久久综合中文久久一本` | 成人9久久国产精品品 | 四虎最新免费观看网址 | 色人久久|