您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java的可變參數(shù)方法怎么用的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
首先看下可變參數(shù)方法在代碼上是如何定義的,如下所示:
public static void method1(Integer id, String... names) { System.out.println("id:" + id + " names:" + names.length); }
通過上面的示例,我們可以看出在定義方法時,在最后一個形參類型后加上三點 …,就表示該形參可以接受多個相同類型的參數(shù)值,多個參數(shù)值被當(dāng)成數(shù)組傳入。
這里我們需要注意幾個點:
可變參數(shù)只能作為函數(shù)的最后一個參數(shù),在其前面可以有也可以沒有任何其他參數(shù);
由于可變參數(shù)必須是最后一個參數(shù),所以一個函數(shù)最多只能有一個可變參數(shù);
Java
的可變參數(shù),會被編譯器轉(zhuǎn)型為一個數(shù)組;
上面提到可變參數(shù)的形式會被編譯成一個數(shù)組,那么問題來了,我可不可以寫兩個下面這樣的方法呢?
public static void method1(Integer id, String... names) { System.out.println("id:" + id + " names:"+ names.length); } public static void method1(Integer id, String[] names) { 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)用跟其他方法的調(diào)用沒什么區(qū)別,這里要說明的是,我們除了通過可變參數(shù)進行調(diào)用之外,還可以通過傳入數(shù)組的形式來進行調(diào)用,如下所示:
public static void main(String[] args) { //直接傳遞參數(shù) method1(1, "ziyou", "java極客技術(shù)"); //通過數(shù)組的形式傳遞參數(shù) String[] array = new String[]{"ziyou", "Java 極客技術(shù)", "fdf"}; method1(2, array); //不傳遞可變參數(shù) method1(3); }
通過可變參數(shù)和數(shù)組的形式,這兩種調(diào)用形式本質(zhì)上是一樣的;另外可變參數(shù)的個數(shù)也可以為 0。
試想一下如果我們定義了下面這樣的兩個方法,定義和使用的時候會是什么情況
public static void method2(String... names) { System.out.println("111111"); } public static void method2(String value1, String value2) { System.out.println("22222"); }
第一個是只有一個可變參數(shù)形參的方法;第二個是一個 String 類型的固定參數(shù)和第二個參數(shù)是可變參數(shù)的方法。首先,定義的時候完全沒有問題,IDEA 也沒有任何錯誤提示,編譯也不會有問題。
那么在使用的時候呢?比如下面這樣的寫法會輸出什么結(jié)果呢?
public static void main(String[] args) { method2("java 極客技術(shù)", "ziyou"); }
在看輸出結(jié)果之前,我們可以看到,main 函數(shù)中的調(diào)用,其實這兩個重載的函數(shù)都是可以滿足的,而且編譯也沒有錯,那么程序運行會輸出什么呢?
通過實際的運行結(jié)果我們可以看到,輸出的結(jié)果是22222
表示運行的是method2(String value1, String value2
) 這個方法,那說明什么問題呢?
說明當(dāng)存在與可變參數(shù)方法形成重載方法的時候的,會優(yōu)先固定參數(shù)的方法進行執(zhí)行,相信這一點大家應(yīng)該都從來沒有關(guān)注過。
寫到這里可能有小明要問了,那如果我們第二個方法中的 value2
也是可變參數(shù)呢?那這種情況會怎么樣呢?為此我們再看一下,下面的這種形式會怎樣。
public static void method2(String... names) { System.out.println("111111"); } public static void method2(String value1, String value2) { System.out.println("22222"); } public static void method2(String value1, String... value2) { System.out.println("33333"); }
首先定義的時候 IDEA 沒有任何錯誤提示,說明編譯是沒有問題的,那調(diào)用的時候呢?
可以看到這個時候 IDEA 已經(jīng)提示我們匹配到多個方法合適的方法,不能編譯通過,主要是第一個和第三個方式的寫法導(dǎo)致的,匹配到了多個可變參數(shù)的方法,我們?nèi)粘i_發(fā)的時候要注意這個問題。
看到這樣有小明就要問了,那我可不可以創(chuàng)建一個基于 Object 的可變參數(shù)方法,這樣子這個方法不就是可以接受所有類型的參數(shù)了嗎?就像這樣:
public static void method3(Object... objects) { System.out.println("objects size" + objects.length); }
以上就是“Java的可變參數(shù)方法怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。