1、數組創建的方法有很多種:
int[] anArray ;//這一步只是做了聲明,內存中並沒分配,這一點是和C/C++不同的地方 anArray = new int[10];//這一步數組才真正建立
int[] anArray = {1,2,3};
2、數組與Array類的關系:
數組的寫法與創建方式與一般的類有很大的不同,我一直認為數組與Java基本數據類型相似。其實不是。數組的創建確實與一般的類有所不同。
Java中的所有數組都是通過Array類實例化。Array類沒有public的構造方法,數組是通過Array的newInstance()方法進行實例化。
源代碼如下:
一維數組:
public static Object newInstance(Class<?> componentType, int length)//componentType 數組的類型,length數組的長度 throws NegativeArraySizeException { return newArray(componentType, length); //這個方法會調用底層C代碼開辟內存空間 }
多維數組:
public static Object newInstance(Class<?> componentType, int... dimensions) throws IllegalArgumentException, NegativeArraySizeException { return multiNewArray(componentType, dimensions); }
3、除去各種通過編譯器簡單化的寫法后,還原真實的數組創建,過程如下:
Object array = Array.newInstance(int.class,2);//創建數組實例 Array.set(array, 1/*index*/, 1);// 給數組元素賦值 Array.get(array, 1/*index*/);//取值
多維數組的類似,只是set和get的時候把第二維維度的數組理解為第一維度中的數據值的數據類型即可。
如:
Object array = Array.newInstance(int.class, 2,2); Object arrayF = Array.get(array, 0); Array.set(arrayF, 0, 1);
4、本人的一些猜想
1、數組的實例化之所以不用構造函數的方法,是因為數組的類型其實是無數種。用構造方法來實例化不利於對不同類型數組的擴展。
2、每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。
3、Java反射技術除了可以在運行時動態地決定要創建什么類型的對象,訪問哪些成員變量,方法,還可以動態地創建各種不同類型,不同維度的數組。
*花邊知識
1、關於Class類可參考:http://lavasoft.blog.51cto.com/62575/15433
2、for循環遍歷數組的方法
Employee[] staff = new Employee[3]; staff[0] = new Employee("a"); staff[1] = new Employee("b"); staff[2] = new Employee("c"); for( Employer e : staff){ System.out.println( e.getName() ); }