溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中什么是可變參數

發(fā)布時間:2021-07-24 17:02:44 來源:億速云 閱讀:100 作者:Leah 欄目:編程語言

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

  Java 的可變參數究竟是怎么一回事?可變參數是 Java 1.5 的時候引入的功能,它允許方法使用任意多個、類型相同(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 個、 4 個或者更多個字符串都可以作為參數傳遞給 print() 方法。

  說到可變參數,我想起來阿里巴巴開發(fā)手冊上有這樣一條規(guī)約。

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

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

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

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

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

  }

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

  那一般什么時候使用可變參數呢?

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

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

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

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

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

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

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

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

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

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

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

  那在使用可變參數的時候有什么注意事項嗎?

  有的,有的。我們要避免重載帶有可變參數的方法——這樣很容易讓編譯器陷入自我懷疑中

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

  }

  這時候,編譯器完全不知道該調用哪個 print() 方法,print(String... strs) 還是 print(Integer... ints),傻傻分不清。

  假如真的需要重載帶有可變參數的方法,就必須在調用方法的時候給出明確的指示,不要讓編譯器去猜。

  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) {

  }

  上面這段代碼是可以編譯通過的。因為編譯器知道實參是 String 類型還是 Integer 類型,只不過為了運行時不拋出 NullPointerException,兩個 print() 方法的內部要做好判空的操作。

關于Java中什么是可變參數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI