1. 程式人生 > >Java中的變數儲存

Java中的變數儲存

總共5類
a.暫存器:最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制.
b. 棧:存放基本型別的變數資料和物件的引用,但物件本身不存放在棧中,而是存放在堆(new 出來的物件)或者常量池中(字串常量物件存放在常量池中。)
c. 堆:存放所有new出來的物件。
d. 靜態域:存放靜態成員(static定義的)
e. 常量池:存放字串常量和基本型別常量(public static final)

對於棧和常量池中的物件可以共享,對於堆中的物件不可以共享。棧中的資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會消失。堆中的物件的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。

以下程式碼為詳細說明

1.class BirthDate {  
2.    private int day;  
3.    private int month;  
4.    private int year;      
5.    public BirthDate(int d, int m, int y) {  
6.        day = d;   
7.        month = m;   
8.        year = y;  
9.    }  
10.   //省略get,set方法………  
11.}  
12.  
13.public class Test{  
14.
public static void main(String args[]){ 15. int date = 9; 16. Test test = new Test(); 17. test.change(date); 18. BirthDate d1= new BirthDate(7,7,1970); 19. } 20. 21. public void change1(int i){ 22. i = 1234; 23. }

對於以上這段程式碼,date為區域性變數,i,d,m,y都是形參為區域性變數,day,month,year為成員變數。下面分析一下程式碼執行時候的變化:

  1. main方法開始執行:int date = 9;
    date區域性變數,基礎型別(沒有引用一說,只有值),值存在棧中。

  2. Test test = new Test();
    test為物件引用,存在棧中,物件(new Test())存在堆中。

  3. test.change(date);
    i為區域性變數,值存在棧中。當方法change執行完成後,i就會從棧中消失。

  4. BirthDate d1= new BirthDate(7,7,1970);
    d1 為物件引用,存在棧中,物件(new BirthDate())存在堆中,其中d,m,y為區域性變數儲存在棧中,且它們的型別為基礎型別,因此它們的資料也儲存在棧中。 day,month,year為成員變數,它們儲存在堆中(new BirthDate()裡面)。當BirthDate構造方法執行完之後,d,m,y將從棧中消失。

    5.main方法執行完之後,date變數,test,d1引用將從棧中消失,new Test(),new BirthDate()將等待垃圾回收