Java中的數組是靜態的,一旦初始化後,長度就不會改變。所謂初始化,就是爲數組對象的元素分配內存空間,爲每個數組元素指定初始化值。
初始化有兩種方式:
1、靜態初始化:初始化時由我們顯示賦值,由系統決定長度,即我們自己確定每個數組元素是什麼,但是不規定長度。
String [] students=new String[]
{
"西昌","酒泉"
}
String [] students=
{
"西昌","酒泉"
}
2、動態初始化:初始化時我們只負責指定長度,不負責爲數組元素賦值。
String [] students=new String[3];
當我們定義一個數組變量時,比如String [] students; students這個數組變量(引用變量)並沒有指向一個有效的內存,直到我們完成了初始化後,students就會像一個指針一樣,指向一個有效的數組對象。實際上初始化,並不是初始化對象的引用變量(students),而是對對象本身進行初始化(此處也就是系統爲數組分配內存空間,將數組元素的值存入對應內存裏)。
對於Java中的所有引用變量,它們都不需要經過所謂初始化操作,需要進行初始化操作的只是該引用變量所對應的對象。引用變量只是棧內存中的變量本身,它的本質是一個指針,只有當引用變量調用方法,或者訪問屬性時,該引用變量纔會由它所引用的對象代替。(補充:所有局部變量都是放在棧內保存,不論是基本類型變量(int a),還是引用類型變量(String [] students)都是存儲在各自棧內;但引用類型變量所引用的對象(包括數組,普通Java對象)則總是存儲在內存中)
//此時系統不會去訪問students所引用的數組對象
System.out.println(students);
/*此時students訪問了length屬性,所以此刻程
序自動訪問students所引用的數組對象*/
System.out.println(students.length);
System.out.println(students[0]);
此時我們就可以解釋一個NullPointerException的一種情況了。當我們用引用變量訪問實例屬性,或者調用非靜態方法時,如果該引用變量沒有引用一個對象,程序就會發生空指針異常。
String []students;
System.out.println(students.length);
//會拋出空指針異常
最後談談多維數組,多位數組的本質其實就是一維數組。如下圖所示:
//定義並且初始化一個一維數組
Object[] obj1=new Object[2];
obj1[1]=new Object[2];
//將obj[1]的值賦值給obj2
Object[] obj2=(Object[])obj1[1];
//......
依次類推,定義的一個一維數組中的每個空間放置一個一維數組,然後在放置的一維數組的空間內再放置一維數組,不斷下去這樣其實就是一個多維數組了。就等同於創建如下類似的多維數組:
Object[] obj=new Objecta[c];
今天分享就到這裏,希望對大家有所收穫。(原文在我自己博客裏面原文地址)
參考書籍:李剛《瘋狂Java》