首先說明,"Java中的基本數據類型一定存儲在棧中的嗎?”這句話肯定是錯誤的。
對於成員變量和局部變量:成員變量就是方法外部,類的內部定義的變量;局部變量就是方法或語句塊內部定義的變量。局部變量必須初始化。 形式參數是局部變量,局部變量中基礎數據類型的引用和值都存儲在棧中,對象引用存在棧中,對象存在堆中。棧內存中的局部變量隨着方法的消失而消失。 成員變量存儲在堆中的對象里面,由垃圾回收器負責回收。 如以下代碼:
class BirthDate { private int day; private int month; private int year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } // 省略get,set方法……… } public class Test { public static void main(String args[]) { int date = 9; Test test = new Test(); test.change(date); BirthDate d1 = new BirthDate(7, 7, 1970); } public void change(int i) { i = 1234; } }
對於以上這段代碼,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()將等待垃圾回收。