java基礎(九) 可變引數列表介紹

程式設計師歐陽思海發表於2018-04-19

一、可變引數簡介

在不確定引數的個數時,可以使用可變的引數列表。

1. 語法:

引數型別...(三個點)

例如: void printArray(Object...)

注意: 每個方法最多隻有一個可變引數,因為:可變引數必須是方法的最後一個引數

2. 可變引數的型別

可變引數可以設定為任意型別:引用型別,基本型別;當然也會進行型別檢查的;

3. 引數的個數:

  • 0個引數
  • 1個引數: 如果是陣列,那麼就直接將這個陣列作為引數傳進方法裡面,不再填充新的陣列;
  • 多個引數: 引數可以是陣列,也可以是單個變數、常量;但是這時候會,將這些引數填充進新的陣列裡面,再將這個陣列,傳進方法裡面;

4. 可變引數的使用

可變引數完全可以當作一個陣列來使用,或者說,本質上可變引數就是一個陣列(下面詳細介紹)。所以,陣列擁有的方法、屬性,可變引數一樣擁有。

public void varArgMethod(int b,int... arr) {
    //和陣列一樣,擁有屬性length
    int lenth = arr.length;
    //索引遍歷
    for(int i=0;i<arr.length;i++) {
        System.out.println(arr[i]);
    }
    //forEach迴圈遍歷
    for(int ele:arr) {
        System.out.println(ele);
    }   
}
複製程式碼

上面的例子中,可變引數的使用跟陣列的使用是完全一樣,也就是說,可變引數是可以等價成陣列的

5. 可變引數的方法過載

可變引數列表的方法的過載不同於普通方法: 無法僅通過改變 可變引數的型別,來過載方法

如:varArray(int... a)varArray(Object... a),這兩個方法在呼叫時會出錯,方法過載失敗。

二、 深入分析可變引數的原理

前面已經很詳細地介紹了可變引數的各個方面。這一小節將深入去了解可變引數的實現原理,特別是為什麼可變引數的使用與陣列是一樣的。

看下面一個簡單的例子:

public class MyTest{

public static void main(String[] args) {
    int a = 100;
    varArgMethod(5, 7,8,9,10,a);
 }

public static void varArgMethod(int b,int... arr) {
    //索引遍歷
    for(int i=0;i<arr.length;i++) {
        System.out.println(arr[i]);
    }
 }

}
複製程式碼

例子很簡單,為了瞭解編譯器是怎麼處理的,我們用jad對上面例子的class檔案進行反編譯:

public class MyTest {

    public static void main(String args[]) {
        int a = 100;
        varArgMethod(5, new int[]{7, 8, 9, 10, a});//引數列表被編譯器處理成了一個int[]陣列
    }

    public static transient void varArgMethod(int b, int arr[]) { //形參被編譯器處理成陣列
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);

    }
}
複製程式碼

從反編譯的結果可以看出,編譯器不僅將可變引數處理成陣列varArgMethod(int b, int arr[]),還處理了呼叫可變引數方法處的引數列表,把引數列表封裝進一個陣列varArgMethod(5, new int[]{7, 8, 9, 10, a})

現在看來,可變引數列表並沒有多神奇,只不過是將程式設計師做的工作簡化了,交給了編譯器來處理。最後,可變引數的使用和陣列一樣也就不出奇了,因為可變引數最後還是被編譯器處理成了陣列,可變引數就是陣列

出處:http://www.cnblogs.com/jinggod/p/8426046.html 文章有不當之處,歡迎指正,你也可以關注我的微信公眾號:好好學java,獲取優質資源。

相關文章