1. 程式人生 > >記憶體分配: 類變數、例項變數、成員變數、區域性變數

記憶體分配: 類變數、例項變數、成員變數、區域性變數

成員變數有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、當局部變數一旦脫離作用域,記憶體立即釋放;