国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java中什么是可變參數

發(fā)布時(shí)間:2021-07-27 11:45 來(lái)源:億速云 閱讀:0 作者:Leah 欄目: 編程語(yǔ)言 歡迎投稿:712375056

這篇文章給大家介紹Java中什么是可變參數,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

  Java 的可變參數究竟是怎么一回事?可變參數是 Java 1.5 的時(shí)候引入的功能,它允許方法使用任意多個(gè)、類(lèi)型相同(is-a)的值作為參數。就像下面這樣。

  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() 就使用了可變參數,所以 print("沉") 可以,print("沉", "默") 也可以,甚至 3 個(gè)、 4 個(gè)或者更多個(gè)字符串都可以作為參數傳遞給 print() 方法。

  說(shuō)到可變參數,我想起來(lái)阿里巴巴開(kāi)發(fā)手冊上有這樣一條規約。

  意思就是盡量不要使用可變參數,如果要用的話(huà),可變參數必須要在參數列表的最后一位。既然坑位有限,只能在最后,那么可變參數就只能有一個(gè)(悠著(zhù)點(diǎn),悠著(zhù)點(diǎn))。如果可變參數不在最后一位,IDE 就會(huì )提示對應的錯誤,如下圖所示。

  那可變參數是怎么工作的呢?

  原理也很簡(jiǎn)單。當使用可變參數的時(shí)候,實(shí)際上是先創(chuàng )建了一個(gè)數組,該數組的大小就是可變參數的個(gè)數,然后將參數放入數組當中,再將數組傳遞給被調用的方法。

  這就是為什么可以使用數組作為參數來(lái)調用帶有可變參數的方法的根本原因。代碼如下所示。

  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();

  }

  那如果方法的參數是一個(gè)數組,然后像使用可變參數那樣去調用方法的時(shí)候,能行得通嗎?大家感興趣的話(huà),不妨試一試(行不通,噓)。

  那一般什么時(shí)候使用可變參數呢?

  可變參數,可變參數,顧名思義,當一個(gè)方法需要處理任意多個(gè)相同類(lèi)型的對象時(shí),就可以定義可變參數。Java 中有一個(gè)很好的例子,就是 String 類(lèi)的 format() 方法,就像下面這樣。

  System.out.println(String.format("年紀是: %d", 18));

  System.out.println(String.format("年紀是: %d 名字是: %s", 18, "沉默王二"));

  PS:%d 表示將整數格式化為 10 進(jìn)制整數,%s 表示輸出字符串。

  如果不使用可變參數,那需要格式化的參數就必須使用“+”號操作符拼接起來(lái)了。麻煩也就惹禍上身了。

  在實(shí)際的項目代碼中,開(kāi)源包 slf4j.jar 的日志輸出就經(jīng)常要用到可變參數(log4j 就沒(méi)法使用可變參數,日志中需要記錄多個(gè)參數時(shí)就痛苦不堪了)。就像下面這樣。

  protected Logger logger = LoggerFactory.getLogger(getClass());

  logger.debug("名字是{}", mem.getName());

  logger.debug("名字是{},年紀是{}", mem.getName(), mem.getAge());

  查看源碼就可以發(fā)現,debug() 方法使用的可變參數。

  public void debug(String format, Object... arguments);

  那在使用可變參數的時(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í)候,編譯器完全不知道該調用哪個(gè) print() 方法,print(String... strs) 還是 print(Integer... ints),傻傻分不清。

  假如真的需要重載帶有可變參數的方法,就必須在調用方法的時(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ò)的。因為編譯器知道實(shí)參是 String 類(lèi)型還是 Integer 類(lèi)型,只不過(guò)為了運行時(shí)不拋出 NullPointerException,兩個(gè) print() 方法的內部要做好判空的操作。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

亚洲AV无码专区精品无码| 午夜肉伦伦影院| 国产小视频在线观看网站| 亚洲人成网站在线观看播放| 亚洲AV无码国产精品久久不卡| 少妇被粗大猛进进出出|