這篇文章給大家介紹Java中什么是可變參數(shù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)徐水免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。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() 方法。
說到可變參數(shù),我想起來阿里巴巴開發(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ù)來調(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)操作符拼接起來了。麻煩也就惹禍上身了。
在實(shí)際的項(xiàng)目代碼中,開源包 slf4j.jar 的日志輸出就經(jīng)常要用到可變參數(shù)(log4j 就沒法使用可變參數(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) {
}
上面這段代碼是可以編譯通過的。因?yàn)榫幾g器知道實(shí)參是 String 類型還是 Integer 類型,只不過為了運(yùn)行時(shí)不拋出 NullPointerException,兩個(gè) print() 方法的內(nèi)部要做好判空的操作。
關(guān)于Java中什么是可變參數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。