這篇文章給大家介紹Java中什么是可變參數(shù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)是一家專業(yè)從事做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,成都創(chuàng)新互聯(lián)依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!
Java 的可變參數(shù)究竟是怎么一回事?可變參數(shù)是 Java 1.5 的時(shí)候引入的功能,它允許方法使用任意多個(gè)、類型相同(is-a)的值作為參數(shù)。就像下面這樣。
public static void main(String[] args) {
print("沉");
print("沉", "默");
print("沉", "默", "王");
print("沉", "默", "王", "二");
}
public static void print(String... strs) {
for (String s : strs)
System.out.print(s);
System.out.println();
}
靜態(tài)方法 print() 就使用了可變參數(shù),所以 print("沉") 可以,print("沉", "默") 也可以,甚至 3 個(gè)、 4 個(gè)或者更多個(gè)字符串都可以作為參數(shù)傳遞給 print() 方法。
說(shuō)到可變參數(shù),我想起來(lái)阿里巴巴開發(fā)手冊(cè)上有這樣一條規(guī)約。
意思就是盡量不要使用可變參數(shù),如果要用的話,可變參數(shù)必須要在參數(shù)列表的最后一位。既然坑位有限,只能在最后,那么可變參數(shù)就只能有一個(gè)(悠著點(diǎn),悠著點(diǎn))。如果可變參數(shù)不在最后一位,IDE 就會(huì)提示對(duì)應(yīng)的錯(cuò)誤,如下圖所示。
那可變參數(shù)是怎么工作的呢?
原理也很簡(jiǎn)單。當(dāng)使用可變參數(shù)的時(shí)候,實(shí)際上是先創(chuàng)建了一個(gè)數(shù)組,該數(shù)組的大小就是可變參數(shù)的個(gè)數(shù),然后將參數(shù)放入數(shù)組當(dāng)中,再將數(shù)組傳遞給被調(diào)用的方法。
這就是為什么可以使用數(shù)組作為參數(shù)來(lái)調(diào)用帶有可變參數(shù)的方法的根本原因。代碼如下所示。
public static void main(String[] args) {
print(new String[]{"沉"});
print(new String[]{"沉", "默"});
print(new String[]{"沉", "默", "王"});
print(new String[]{"沉", "默", "王", "二"});
}
public static void print(String... strs) {
for (String s : strs)
System.out.print(s);
System.out.println();
}
那如果方法的參數(shù)是一個(gè)數(shù)組,然后像使用可變參數(shù)那樣去調(diào)用方法的時(shí)候,能行得通嗎?大家感興趣的話,不妨試一試(行不通,噓)。
那一般什么時(shí)候使用可變參數(shù)呢?
可變參數(shù),可變參數(shù),顧名思義,當(dāng)一個(gè)方法需要處理任意多個(gè)相同類型的對(duì)象時(shí),就可以定義可變參數(shù)。Java 中有一個(gè)很好的例子,就是 String 類的 format() 方法,就像下面這樣。
System.out.println(String.format("年紀(jì)是: %d", 18));
System.out.println(String.format("年紀(jì)是: %d 名字是: %s", 18, "沉默王二"));
PS:%d 表示將整數(shù)格式化為 10 進(jìn)制整數(shù),%s 表示輸出字符串。
如果不使用可變參數(shù),那需要格式化的參數(shù)就必須使用“+”號(hào)操作符拼接起來(lái)了。麻煩也就惹禍上身了。
在實(shí)際的項(xiàng)目代碼中,開源包 slf4j.jar 的日志輸出就經(jīng)常要用到可變參數(shù)(log4j 就沒(méi)法使用可變參數(shù),日志中需要記錄多個(gè)參數(shù)時(shí)就痛苦不堪了)。就像下面這樣。
protected Logger logger = LoggerFactory.getLogger(getClass());
logger.debug("名字是{}", mem.getName());
logger.debug("名字是{},年紀(jì)是{}", mem.getName(), mem.getAge());
查看源碼就可以發(fā)現(xiàn),debug() 方法使用的可變參數(shù)。
public void debug(String format, Object... arguments);
那在使用可變參數(shù)的時(shí)候有什么注意事項(xiàng)嗎?
有的,有的。我們要避免重載帶有可變參數(shù)的方法——這樣很容易讓編譯器陷入自我懷疑中
public static void main(String[] args) {
print(null);
}
public static void print(String... strs) {
for (String a : strs)
System.out.print(a);
System.out.println();
}
public static void print(Integer... ints) {
for (Integer i : ints)
System.out.print(i);
System.out.println();
}
這時(shí)候,編譯器完全不知道該調(diào)用哪個(gè) print() 方法,print(String... strs) 還是 print(Integer... ints),傻傻分不清。
假如真的需要重載帶有可變參數(shù)的方法,就必須在調(diào)用方法的時(shí)候給出明確的指示,不要讓編譯器去猜。
public static void main(String[] args) {
String [] strs = null;
print(strs);
Integer [] ints = null;
print(ints);
}
public static void print(String... strs) {
}
public static void print(Integer... ints) {
}
上面這段代碼是可以編譯通過(guò)的。因?yàn)榫幾g器知道實(shí)參是 String 類型還是 Integer 類型,只不過(guò)為了運(yùn)行時(shí)不拋出 NullPointerException,兩個(gè) print() 方法的內(nèi)部要做好判空的操作。
關(guān)于Java中什么是可變參數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章名稱:Java中什么是可變參數(shù)
轉(zhuǎn)載源于:http://aaarwkj.com/article42/pjcdec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、全網(wǎng)營(yíng)銷推廣、網(wǎng)站設(shè)計(jì)公司、虛擬主機(jī)、軟件開發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)