天天看點

Java中成員變量和局部變量在記憶體中的配置設定

"Java中的基本資料類型一定存儲在棧中的嗎?”

這句話肯定是錯誤的。

對于成員變量和局部變量:成員變量就是方法外部,類的内部定義的變量;局部變量就是方法或語句塊内部定義的變量。局部變量必須初始化。 形式參數是局部變量,

局部變量中基礎資料類型的引用和值都存儲在棧中,對象引用存在棧中,棧記憶體中的局部變量随着方法的消失而消失。

對象存在堆中。 成員變量存儲在堆中的對象裡面,由垃圾回收器負責回收。

在方法内的局部變量是基本資料類型的話那麼運作時存儲在棧stack(java虛拟機棧)中,若是對象,則引用配置設定在記憶體棧stack(java虛拟機棧)中,對象執行個體配置設定到堆内,

類的成員變量 ,無論是基本類型還是其它類型,因為整個執行個體對象都被配置設定到堆heap中,是以成員變量也在堆heap類了

如以下代碼:

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()将等待垃圾回收。

Java中成員變量和局部變量在記憶體中的配置設定

繼續閱讀