Java可變參數

來源:互聯網
上載者:User

標籤:轉換   nbsp   ...   tar   box   bsp   3.2   基礎資料型別 (Elementary Data Type)   資料   

在jdk5之前,可能我們要通過這樣的方式來實現可變參數的方法:

package www.com.thinkInJava.initializationCleanup;public class VarArgs {    static void printArray(Object[] args) {        for(Object obj : args) {            System.out.print(obj + " ");        }        System.out.println();    }    public static void main(String[] args) {        printArray(new Object[]{new Integer(23), 23.2f, "sdfdsf", new Double(23.234), new A()});    }    }class A{}

通過Object[]數組來實現。

輸出如下:

 

 

但在jdk5之後,Java終於有可變參數這個特徵了。

文法類似於static void printArray(Object... args)

package www.com.thinkInJava.initializationCleanup;public class VarArgs {    static void printArray(Object...args) {        for(Object obj : args) {            System.out.print(obj + " ");        }        System.out.println();    }    public static void main(String[] args) {        printArray(new Integer(32), 23.f, "sfsdf", new String("helosdfakl"), 234, new A());        printArray((Object[])new Integer[]{12, 23, 345, 456, new Integer(666)});        printArray();    }    }class A{}

 

 

輸出如下:

 

main函數裡的第一句調用可見,這個可變參數的原理應該類似於我們之前的Object[]的方法,因為我們傳進去的是普通的不同的參數,而卻可以用array的foreach來遍曆元素,說明應該是自動將一系列元素轉換成了數組;

main函數的第二句調用可見,還可以直接傳一個數組Object的array進去。(這裡我們將Integer引用的數群組轉換成了Object的,同時數組的定義裡面也用了autoboxing,即把普通的int自動轉換成對應的Integer對象。)

main函數的第三句調用可見,對於可變參數的方法,可以什麼都不傳過去。

 

下面一個例子證明了,可變參數確實是把參數轉換成了數組的形式:

package www.com.thinkInJava.initializationCleanup;public class VarargType {    static void f(Character... args) {        System.out.print(args.getClass());        System.out.println(" length " + args.length);    }    static void g(int... args) {        System.out.print(args.getClass());        System.out.println(" length " + args.length);    }        public static void main(String[] args) {        f(‘a‘);        f();        g(1);        g();        System.out.println("int[]: " + new int[0].getClass());    }}

輸出:

這裡,class的描述,有個“[”開頭,表明這個class是個數組,然後中括弧後面緊跟著的就是這個數組的資料類型,像這裡緊跟著的I表明這是個基礎資料型別 (Elementary Data Type)int的數組。

main函數裡面最後的一行代碼證明了這個過程,直接輸出了一個int數組的getClass,輸出和上面的一樣,證明可變參數確實是把元素轉換成數組。

 

 

方法的重載overload也是可以用可變參數的,但可能會使方法變得很複雜,建議小心使用,這裡也給個例子:

package www.com.thinkInJava.initializationCleanup;public class OverloadingVarargs {    static void f(Character... args) {        System.out.print("first");        for (Character c : args)            System.out.print(" " + c);        System.out.println();    }    static void f(Integer... args) {        System.out.print("second");        for (Integer i : args)            System.out.print(" " + i);        System.out.println();    }    static void f(Long... args) {        System.out.println("third");    }    public static void main(String[] args) {        f(‘a‘, ‘b‘, ‘c‘);        f(1);        f(2, 1);        f(0);        f(0L);        // ! f(); // Won’t compile -- ambiguous    }}

 

輸出結果:

這裡看到,不能調用沒有參數的f()了,因為編譯器無法辨別是哪個方法。這個無參數的方法調用連編譯都無法通過。

 

Java可變參數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.