Chapter5_初始化與清理_數組初始化與可變參數列表
一、數組初始化
數組是相同類型的,用一個標識符名稱封裝到一起的一個對象序列或基本類型數據序列。編譯器是不允許指定數組的長度的,當使用語句int[] a時,擁有的只是一個符號名,即一個數組的引用,並不擁有這個數組的存儲空間。要獲取數組的存儲空間,必須要寫初始化表達式,最樸素的表達式類型如下
1 int[] a = {1,2,3};
如果在編寫程序時,不能確定數組的長度,可以使用如下方式,直接用new在數組裏創建元素
1 int[] a = new int[3];
當創建對象數組時,數組中的元素僅僅是對象的引用,當試圖使用數組中的空引用時,會引起編譯器運行期錯誤,這是需要註意的,可以使用用花括號括起來的列表初始化對象數組。
1 Integer[] = { 2 new Integer(1), 3 new Integer(2), 4 3, 5 }
數組類型還有兩個使用很多的方法,一個是length()方法,用來返回數組的長度,一個是.toString()方法,會將數組以可視化的方法打印出來。
二、可變參數列表
先舉一個可變參數的例子。
1 class A{ 2 3 } 4 5 public class test{ 6 static void print(Object... args){ 7 for(Object obj:args){8 System.out.print(obj + " "); 9 } 10 System.out.println(); 11 } 12 public static void main(String args[]){ 13 print(new Integer(1), new Float(2.0), new Double(3.0)); 14 print("a", "b", "c"); 15 print(new A(), new A(), new A()); 16 } 17 18}
1 1 2.0 3.0 2 a b c 3 [email protected] [email protected] [email protected]
這種方法的效果是可變參數列表和自動包裝機制的和諧共處,使用了可變參數列表,當指定參數類型後,編譯器會給你自動填充數組,即允許將一組事物當做列表傳遞給一個數組,並且將空參數列表傳遞給可變參數列表是可行的。除了object類型的參數列表,參數列表可以使用任何類型的參數,包括基本類型。
使用可變參數列表,會使重載過程變得更加復雜,需要註意這種復雜帶來的問題,以下是一個例子。
1 public class test{ 2 static void f(Character... args){ 3 System.out.print("first"); 4 for(Character c:args){ 5 System.out.print(c + " "); 6 } 7 System.out.println(); 8 } 9 10 static void f(Integer... args){ 11 System.out.print("first"); 12 for(Integer c:args){ 13 System.out.print(c + " "); 14 } 15 System.out.println(); 16 } 17 18 static void f(Long... args){ 19 System.out.print("third"); 20 } 21 22 public static void main(String args[]){ 23 f(‘a‘, ‘b‘, ‘c‘); 24 f(1); 25 f(2, 1); 26 f(0); 27 f(0l); 28 //f(); 29 } 30 31 }
在這種情況下,不能調用f()方法,因為編譯器會不知道該調用哪個方法了,這是可變參數列表帶來的潛在的隱患。為了解決這種隱患,可以給每個參數列表都添加一個非可變參數,例如:
1 static void f(Integer i,Integer... args); 2 static void f(float i, float... args);
Chapter5_初始化與清理_數組初始化與可變參數列表