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為成員變數。下面分析一下程式碼執行時候的變化:
main方法開始執行:int date = 9;
date區域性變數,基礎型別(沒有引用一說,只有值),值存在棧中。Test test = new Test();
test為物件引用,存在棧中,物件(new Test())存在堆中。test.change(date);
i為區域性變數,值存在棧中。當方法change執行完成後,i就會從棧中消失。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()將等待垃圾回收