如何理解成員變數在堆內,區域性變數在棧內?

2021-08-17 16:54:28 字數 612 閱讀 1679

成員變數在堆記憶體裡,區域性變數在棧記憶體裡。(基礎型別)

我有疑惑:

既然成員變數存在於物件中,物件存在於堆中,所以成員變數存在於堆中。那麼按照這樣的推理,區域性變數存在於方法中,而方法存在於物件中,物件存在於堆中,那是不是可以說區域性變數存在於堆中?

解決思想

當物件new

出來,實體存在於堆,物件的成員變數已經在堆上分配空間,但物件裡面的方法是沒有出現的,只出現方法的宣告,方法裡面的區域性變數並沒有建立。等到物件呼叫此方法時,為了加快執行的速度,方法中的區域性變數才會在棧中建立,所以,方法中的區域性變數是在棧內的。

當然需要注意的是類變數(靜態變數)存在於方法區!!引用型別的區域性變數宣告在棧,儲存在堆

記憶體:棧 1.存放區域性變數 2.不可以被多個執行緒共享 3.空間連續,速度快

堆 1.存放物件 2.可以被多個執行緒共享 3.空間不連續,速度慢,但是靈活 

方法區 1.存放類的資訊:**、靜態變數、字串常量等等 2.可以被多個執行緒共享 3.空間不連續,速度慢,但是靈活

總的來說:我們先來記住兩條**法則:

1.引用型別總是被分配到「堆」上。不論是成員變數還是區域性

2.基礎型別總是分配到它宣告的地方:成員變數在堆記憶體裡,區域性變數在棧記憶體裡。

成員變數 區域性變數

成員變數 作為類的成員而存在,直接存在於類中。所有類的成員變 量可以通過this來引用。區域性變數 作為方法或語句塊的成員而存在,存在於方法的引數列表和方法定義中。1.成員變數可以被 public,protect,private,static等修飾符修飾,而 區域性變數不能被控制修飾符及 stati...

成員變數 區域性變數

一.相同點 1.都遵循變數的宣告格式 修飾符 資料型別 變數名 初始化值 2.都有各自的作用域 二.不同點 1.宣告的位置不同 成員變數 宣告在類內,方法外。區域性變數 宣告在方法內 方法的形參部分 塊內 2.成員變數的修飾符有四個 public private protected 預設 區域性變數...

成員變數和區域性變數

定義類其實就是在定義類中的成員 成員 成員變數 屬性,成員函式 行為 成員變數和區域性變數的區別 1.成員變數定義在類中,整個類中都可以訪問 區域性變數定義在函式 語句 區域性 塊中,只在所屬的區域有效 2.成員變數存在於堆記憶體的物件中。區域性變數存在於棧記憶體的方法中。3.存活時間不同 成員變數...