記憶體分配: 類變數、例項變數、成員變數、區域性變數
阿新 • • 發佈:2019-01-08
成員變數有2種:類變數和例項變數
類變數(又叫靜態變數):前面加static關鍵字修飾;
1、 jvm把.class類載入到非堆裡,然後在堆中為.class的類變數開闢記憶體;堆中的地址存放於棧以便高速訪問;
2、類變數的生命週期一直持續到整個“系統”關閉;
3、一旦賦值它的值就在你new出來的任何一個例項中具有相同的值;
例項變數:前面不加static關鍵字修飾;
1、當你用java關鍵字new一個物件時,jvm將在堆裡建立物件,並在堆中開闢空間給變數(空間不一定連續),然後根據零散的堆記憶體地址,通過雜湊演算法得到“實體地址”;
2、例項變數的生命週期:當例項變數的引用丟失後,將被gc回收,但並不是馬上釋放堆中記憶體;
3、每一個new出來的新例項都可以對他賦予自己需要的值
例子 class example{ static int a = 0; int b = 1; } a是類變數,b是例項變數 example e1 = new example(); example e2 = new example(); 改變e1中a的值會使e2中的a值也改變,而e1中b值的變化不會帶來e2中b值的變化;
同一個jvm裡,一個類變數只需要分配一個記憶體空間;對於例項變數,每建立一次物件,都需要為例項變數分配一次記憶體空間;
------------------------------------------------------------------------------------
例項變數:宣告在某方法,或某程式碼段裡(如for迴圈)
1、執行它時在堆中開闢記憶體,其引用被置於一個連續的棧中提供高速訪問;
2、當局部變數一旦脫離作用域,記憶體立即釋放;