成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關(guān)于 Java 的可變參數(shù),你真的了解嗎?

開發(fā) 前端
我們都知道 Java 支持可變參數(shù)的形式定義方法,這種語法糖在某些時候可以簡化我們的代碼,但是關(guān)于可變參數(shù)是如何實(shí)現(xiàn)的以及其他的更多細(xì)節(jié),你真的知道嗎?今天阿粉就帶你來了解一下。

本文轉(zhuǎn)載自微信公眾號「Java極客技術(shù)」,作者鴨血粉絲Tang。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號。

我們都知道 Java 支持可變參數(shù)的形式定義方法,這種語法糖在某些時候可以簡化我們的代碼,但是關(guān)于可變參數(shù)是如何實(shí)現(xiàn)的以及其他的更多細(xì)節(jié),你真的知道嗎?今天阿粉就帶你來了解一下。

可變參數(shù)方法的定義

首先看下可變參數(shù)方法在代碼上是如何定義的,如下所示:

  1. public static void method1(Integer id, String... names) { 
  2.       System.out.println("id:" + id + " names:" + names.length); 

通過上面的示例,我們可以看出在定義方法時,在最后一個形參類型后加上三點(diǎn) …,就表示該形參可以接受多個相同類型的參數(shù)值,多個參數(shù)值被當(dāng)成數(shù)組傳入。這里我們需要注意幾個點(diǎn):

  • 可變參數(shù)只能作為函數(shù)的最后一個參數(shù),在其前面可以有也可以沒有任何其他參數(shù);
  • 由于可變參數(shù)必須是最后一個參數(shù),所以一個函數(shù)最多只能有一個可變參數(shù);
  • Java 的可變參數(shù),會被編譯器轉(zhuǎn)型為一個數(shù)組;

上面提到可變參數(shù)的形式會被編譯成一個數(shù)組,那么問題來了,我可不可以寫兩個下面這樣的方法呢?

  1. public static void method1(Integer id, String... names) { 
  2.     System.out.println("id:" + id + " names:"+ names.length); 
  3.  
  4. public static void method1(Integer id, String[] names) { 
  5.     System.out.println("id:" + id + " names:" + names.length); 

在一個類中的定義相同名字的一個可變參數(shù)的方法和一個包含數(shù)組的方法,寫完過后我們就發(fā)現(xiàn) IDEA 已經(jīng)提示我們這種寫法的編譯不了的了。

從這里我們可以知道可變參數(shù)在編譯為字節(jié)碼后,在方法簽名中會以數(shù)組形態(tài)出現(xiàn)的,導(dǎo)致這兩個方法的簽名一致的,如果同時出現(xiàn),是不能編譯通過的。

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

可變參數(shù)方法的調(diào)用跟其他方法的調(diào)用沒什么區(qū)別,這里要說明的是,我們除了通過可變參數(shù)進(jìn)行調(diào)用之外,還可以通過傳入數(shù)組的形式來進(jìn)行調(diào)用,如下所示:

  1. public static void main(String[] args) { 
  2.         //直接傳遞參數(shù) 
  3.         method1(1, "ziyou""java極客技術(shù)"); 
  4.         //通過數(shù)組的形式傳遞參數(shù) 
  5.         String[] array = new String[]{"ziyou""Java 極客技術(shù)""fdf"}; 
  6.         method1(2, array); 
  7.         //不傳遞可變參數(shù) 
  8.         method1(3); 

通過可變參數(shù)和數(shù)組的形式,這兩種調(diào)用形式本質(zhì)上是一樣的;另外可變參數(shù)的個數(shù)也可以為 0。

可變參數(shù)方法的重載

試想一下如果我們定義了下面這樣的兩個方法,定義和使用的時候會是什么情況

  1. public static void method2(String... names) { 
  2.         System.out.println("111111"); 
  3.  
  4. public static void method2(String value1, String value2) { 
  5.         System.out.println("22222"); 
  6.  } 

第一個是只有一個可變參數(shù)形參的方法;第二個是一個 String 類型的固定參數(shù)和第二個參數(shù)是可變參數(shù)的方法。首先,定義的時候完全沒有問題,IDEA 也沒有任何錯誤提示,編譯也不會有問題。

那么在使用的時候呢?比如下面這樣的寫法會輸出什么結(jié)果呢?

  1. public static void main(String[] args) { 
  2.         method2("java 極客技術(shù)""ziyou"); 

在看輸出結(jié)果之前,我們可以看到,main 函數(shù)中的調(diào)用,其實(shí)這兩個重載的函數(shù)都是可以滿足的,而且編譯也沒有錯,那么程序運(yùn)行會輸出什么呢?

通過實(shí)際的運(yùn)行結(jié)果我們可以看到,輸出的結(jié)果是22222 表示運(yùn)行的是method2(String value1, String value2) 這個方法,那說明什么問題呢?

說明當(dāng)存在與可變參數(shù)方法形成重載方法的時候的,會優(yōu)先固定參數(shù)的方法進(jìn)行執(zhí)行,相信這一點(diǎn)大家應(yīng)該都從來沒有關(guān)注過。

寫到這里可能有小明要問了,那如果我們第二個方法中的 value2 也是可變參數(shù)呢?那這種情況會怎么樣呢?為此我們再看一下,下面的這種形式會怎樣。

  1. public static void method2(String... names) { 
  2.         System.out.println("111111"); 
  3.     } 
  4.  
  5.     public static void method2(String value1, String value2) { 
  6.         System.out.println("22222"); 
  7.     } 
  8.  
  9.     public static void method2(String value1, String... value2) { 
  10.         System.out.println("33333"); 
  11.     } 

首先定義的時候 IDEA 沒有任何錯誤提示,說明編譯是沒有問題的,那調(diào)用的時候呢?

可以看到這個時候 IDEA 已經(jīng)提示我們匹配到多個方法合適的方法,不能編譯通過,主要是第一個和第三個方式的寫法導(dǎo)致的,匹配到了多個可變參數(shù)的方法,我們?nèi)粘i_發(fā)的時候要注意這個問題。

Object 可變參數(shù)

看到這樣有小明就要問了,那我可不可以創(chuàng)建一個基于 Object 的可變參數(shù)方法,這樣子這個方法不就是可以接受所有類型的參數(shù)了嗎?就像這樣:

  1. public static void method3(Object... objects) { 
  2.  
  3.         System.out.println("objects size" + objects.length); 
  4.  

首先要說的是,這么定義當(dāng)然是沒有問題的,但是可讀性會差很多,調(diào)用方完全不知道要傳入什么類型;要是真的寫了太多像這樣的代碼,估計維護(hù)起來也是害人害己,這么寫的小明就好自為之吧,被開除了不要說是看了阿粉寫的文章學(xué)會的。

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2018-12-21 11:24:55

Java時間處理編程語言

2023-11-01 13:48:00

反射java

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫

2021-11-09 09:48:13

Logging python模塊

2021-01-15 07:44:21

SQL注入攻擊黑客

2025-01-03 08:09:15

2014-11-28 10:31:07

Hybrid APP

2023-03-16 10:49:55

2019-09-16 08:40:42

2020-02-27 10:49:26

HTTPS網(wǎng)絡(luò)協(xié)議TCP

2023-05-10 11:07:18

2021-11-26 08:07:16

MySQL SQL 語句數(shù)據(jù)庫

2018-01-06 10:38:51

Ping抓包 ICMP協(xié)議

2012-05-31 09:56:54

云安全

2023-10-24 08:53:24

FutureTas并發(fā)編程

2019-11-06 09:52:01

JavaScript單線程非阻塞

2022-12-12 08:46:11

2015-07-31 10:35:18

實(shí)時計算

2017-10-18 22:01:12

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久国产精品一区 | 免费看一级毛片 | 精品国产一区二区三区免费 | 99精品视频在线观看 | 中文字幕亚洲精品 | 亚洲免费福利视频 | 国产成人精品久久二区二区91 | 久久中文字幕一区 | 成人国内精品久久久久一区 | 毛片毛片毛片毛片 | 偷拍自拍网址 | 国产精品区一区二区三区 | 国产精品日韩一区 | 亚洲一区二区三区视频 | 中文字幕av免费 | 日韩网站在线观看 | 欧美日韩在线精品 | 精品亚洲一区二区 | 九九九视频精品 | 99re视频 | 精品在线一区 | 自拍偷拍第一页 | 亚洲成人精品在线观看 | 欧美极品在线观看 | h片免费看 | 国产一区二区三区在线 | 欧美精品在线视频 | 伊人伊人 | 国产精品视频免费观看 | 日韩欧美精品一区 | 美女精品一区 | 久久国产99 | 精品1区2区3区4区 | 久久国内精品 | 中文字幕1区2区3区 日韩在线视频免费观看 | 韩国av一区二区 | 国产一级一级国产 | 亚洲精品3 | 国产高清免费 | 久久综合久久综合久久 | 日本电影免费完整观看 |