標籤:轉換 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可變參數