1. 程式人生 > >成員變數和區域性變數在記憶體中的分配

成員變數和區域性變數在記憶體中的分配

對於成員變數和區域性變數:成員變數就是方法外部,類的內部定義的變數;區域性變數就是方法或語句塊內部定義的變數。區域性變數必須初始化。 形式引數是區域性變數,區域性變數的資料存在於棧記憶體中。棧記憶體中的區域性變數隨著方法的消失而消失。 成員變數儲存在堆中的物件裡面,由垃圾回收器負責回收。 如以下程式碼:

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()將等待垃圾回收。
    這裡寫圖片描述