1. 程式人生 > >JAVA基礎 引用型別變數和基本型別變數

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的儲存空間中