JAVA基礎 引用型別變數和基本型別變數
一 基本型別的變數名是變數本身。 包括八種基本資料型別
引用型別變數的名字是複雜資料的儲存地點。包括類 陣列(字串) 介面
String s="Hello world!";
許多人都寫過這樣的語句,但是,我們到底聲明瞭什麼呢?一休,你回答一下。
一休:聲明瞭一個String物件,內容是"Hello world!"。
愚公:這樣的回答還是比較模糊,準確的回答是這個語句建立了一個字串物件,另外它聲明瞭一個指向物件的引用,名為s。它可以指向型別為String的任何物件,目前指向"Hello world!"這個String型別的物件。
一休:也就是說,我們聲明瞭一個只能指向String物件的引用變數s,並且將s指向了字串物件"Hello world!"。
愚公:是的,如果在剛才的語句後面再補充一句程式碼:
String string=s;
是不是又聲明瞭一個新的物件呢?
一休:是的,聲明瞭一個新的物件string。
愚公:不對,我們是聲明瞭另外一個指向String物件的引用,名為string,並沒有第二個物件產生,string還是指向原來的物件,也就是和s指向同一個物件。String類要弄清楚,因為這個類弄清楚了,許多類就好理解了。
一休:String類這麼重要嗎?
愚公:是的,因為這個類使用的頻率很高,包含許多定製好的屬性和方法,我們可以直接使用,而且這個類是final類,我們不能繼承它,也不能繼承和利用多型性修改它的方法。
一休:那我今後一定好好研究它
二 Java中資料型別分為兩大類:基本資料型別與複合資料型別。相應地,變數也有兩種型別:基本型別與引用型別。Java的8中基本型別的變數稱為基本型別變數,而類、介面和陣列變數時引用型別變數。這兩種型別變數的結構和含義不同,系統對他們的處理也不相同。
1.基本型別與引用型別變數
*基本型別(primitive type)
基本資料型別的變數包含了單個值,這個值的長度和格式符合變數所屬資料型別的要求,可以是一個數字、一個字元或一個布林值,例如一個整型值是32位的二進位制補碼格式的資料,而一個字元型的值是16位的Unicode字元格式的資料等。
*引用型別(reference type)
引用型變數的值與基本型別變數不同,變數值是指向記憶體空間的引用(地址)。所指向的記憶體中儲存著變數所表示的一個值或一組值。
引用在其他語言中稱為指標或記憶體地址。Java語言與其他程式設計語言不同,不支援顯示使用記憶體地址,而必須通過變數名對某個記憶體地址進行訪問。
2.兩種變數的不同處理
在Java語言中基本型別變數宣告時,系統直接給該變數分配空間,因此程式中可以直接操作。例如,
int a; //宣告變數a的同時,系統給a分配了空間
a=12;
引用型別(或稱為引用型)變數宣告時,只是給該變數分配引用空間,資料空間未分配。因此引用型變數聲明後不能直接引用,下列第二條語句是錯誤的:
MyDate today;
today.day = 14; //錯誤!因為today物件的資料空間未分配
......
引用型別變數在聲明後必須通過例項化開闢資料空間,才能對變數所指向的物件進行訪問。通過對引用型變數宣告與例項化語句的執行過程分析,可以理解系統對引用型變數的上述處理。例如有如下語句:
MyDate today;
today = new Date(); //等於MyDate today = new Date ();
第一條語句的執行,將給today變數分配一個儲存引用的空間,第二條語句分兩個步驟執行,首先執行new Date(),給today變數開闢資料空間,然後再執行第二條語句中的賦值操作,
3.引用變數的賦值
Java中引用型變數之間的賦值是引用賦值。例如,下列語句執行後,記憶體的佈局如圖3-5所示。
MyDate a,b; //在記憶體中開闢兩個引用空間
a = new MyDate(); //開闢MyDate物件的資料空間,並把該空間的首地址賦給a
b = a; //將a儲存空間中的地址寫到b的儲存空間中