Java 可變參數列表
class A {}
由於所有的類別都繼承於Object,可以以Object數組為參數的方法:
public class parameter { 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(47), new Float(3.14), new Double(11.11) }); printArray(new Object[]{"one", "two", "there"}); printArray(new Object[]{new A(), new A(), new A()}); } }
可以使用Object以為的參數列表:
public class parameter { public 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(47), new Float(3.14), new Double(11.11)); printArray(47, 3.14F, 11.11); printArray("one", "two", "three"); printArray(new A(), new A(), new A()); printArray((Object[]) new Integer[]{1, 2, 3, 4}); printArray(); } }這是Java 5 引入的一個特性,如果一個方法要接收的參數數量是不確定的,那麼這個特性就可以派上用場了。 例如,在涉及IO操作的地方,基本上至少需要關閉兩個流:輸入、輸出,我喜歡把流關閉的操作封裝成下面的方法,這樣只需一次調用就可以關閉多個流。
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()); } }這是我覺得這個特性唯一適合使用的地方,具備下面的特點:這些參數具有相同的類型;
參數數量不確定,每一個都是可選的;
這些參數的用途都是一樣的,例如上面都是執行關閉。Java 可變長參數清單只能放在方法參數清單的最後。
Java可變長參數列表的實作
Java可變長參數列表的實作是透過編譯器把這些參數封裝成一個陣列來傳遞的。