1. 程式人生 > >Java 可變長引數

Java 可變長引數

原理

Java可變長引數列表的實現是通過編譯器把把這些引數封裝成一個數組來傳遞的。

注意點

可變成引數列表不能與同類型陣列過載,因為它本身就是陣列

void print(int... args) { }

//Error : Duplicate method print
void print(int[] args) { }

可變成引數型別不能與自動裝箱後型別相同的方法過載

void print(int... args) { }

void print(Integer[] args) { }

void test() {
    //Error : The method print(int[])
is ambiguous for the type print(1, 2, 3)
; }

可變長引數列表只能放在方法引數列表的最後

void print(int firstArg, int... args) { }

//Error : The variable argument type int of the method print must be the last parameter
void print(int... args, String str) { }

引數數量不確定。可以傳多個,也可以一個都不傳,也可以傳null

/*
 * 該方法可以用Arrays.toString(T[] args)來代替。
 */
static void print(int... args) { if(args == null) { System.out.println("args = null"); return; } StringBuilder sb = new StringBuilder(); sb.append("len = "); sb.append(args.length); sb.append("{ "); for(int i=0;i<args.length;i++) { sb.append(args[i]); if
(i != args.length-1) { sb.append(", "); } } sb.append(" }"); System.out.println(sb.toString()); } public static void main(String[] args) { print(1, 2, 3); print();//相當於傳遞一個長度為零的陣列 print(null); }

輸出

len = 3{ 1, 2, 3 }
len = 0{  }
args = null

傳遞變長引數列表和直接傳遞變長引數型別的陣列結果是一樣的

static void print(int... args) {
    if(args == null) {
        System.out.println("args = null");
        return;
    }
    StringBuilder sb = new StringBuilder();
    sb.append("len = ");
    sb.append(args.length);
    sb.append("{ ");
    for(int i=0;i<args.length;i++) {
        sb.append(args[i]);
        if(i != args.length-1) {
            sb.append(", ");
        }
    }
    sb.append(" }");
    System.out.println(sb.toString());
}

public static void main(String[] args) {
    print(1, 2, 3);//經過編譯器改造也會把它變為陣列型別
    print(new int[] {1, 2, 3});
}

輸出

len = 3{ 1, 2, 3 }
len = 3{ 1, 2, 3 }