Java中的基本類型和引用類型變量的區別
基本類型:
基本類型自然不用說了,它的值就是一個數字,一個字符或一個布爾值。
引用類型:
是一個對象類型,值是什麽呢?它的值是指向內存空間的引用,就是地址,所指向的內存中保存著變量所表示的一個值或一組值。
舉例說明:
int a;
a=250; //聲明變量a的同時,系統給a分配了空間。
引用類型就不是了,只給變量分配了引用空間,數據空間沒有分配,因為誰都不知道數據是什麽,整數,字符?我們看一個錯誤的例子:
MyDate today;
today.day = 4; //發生錯誤,因為today對象的數據空間未分配。
那我們怎麽給它賦值?引用類型變量在聲明後必須通過實例化開辟數據空間,才能對變量所指向的對象進行訪問。舉個例子:
MyDate today; //將變量分配一個保存引用的空間
today = new MyDate(); //這句話是2步,首先執行new MyDate(),給today變量開辟數據空間,然後再執行賦值操作
//引用變量賦值
MyDate a,b; //在內存開辟兩個引用空間
a = new MyDate(); //開辟MyDate對象的數據空間,並把該空間的首地址賦給a
b = a; //將a存儲空間中的地址寫到b的存儲空間中
如下圖示
引用傳遞 和 值傳遞
引用類型:除了在函數傳值的時候是"引用傳遞",在任何用"="向對象變量賦值的時候都是"引用傳遞"。
值傳遞:基本類型的傳遞都屬於值傳遞,和C語言一樣,當把Java的基本數據類型(如 int,char,double等)作為入口參數傳給函數體的時候,傳入的參數在函數體內部變成了局部變量,這個局部變量是輸入參數的一個拷貝,所有的函 數體內部的操作都是針對這個拷貝的操作,函數執行結束後,這個局部變量也就完成了它的使命,它影響不到作為輸入參數的變量。這種方式的參數傳遞被稱為"值 傳遞"。
/*define a class*/ class MyDate{ String Year; String Month; String Day; String Date; public MyDate(){ Year = "1900"; Month ="01"; Day = "01"; Date = Year + "." + Month + "."+ Day; } public String toString(){ return Date; } } public class ObjRef{ MyDate mydate1 = new MyDate(); MyDate mydate2 = mydate1;// = 使 mydate1和 mydate2將指向同一內存空間 //MyDate mydate2 = new MyDate();//從新new一個對象,則mydate1和mydate2是指向不同的內存空間的: //引用空/間和數據空間都不一樣 public void changeObj(MyDate inObj){ inObj.Date = "2007.09.26"; } public static void main(String[] args) { ObjRef oRef = new ObjRef(); System.out.println("Before call changeObj() method: " + oRef.mydate1); oRef.changeObj(oRef.mydate1); System.out.println("After call changeObj() method: " + oRef.mydate1); System.out.println("After call changeObj() method: " + oRef.mydate2);//驗證“= mydate1和 mydate2將指向同一內存空間“這一結論 } }
Java中的基本類型和引用類型變量的區別