public class Test
{
private static int sid = 0;
private static int x = print("this is static variable x");
private int id;
Test(int _id)
{
id = _id;
}
void PRINT()
{
System.out.println("sid: "+sid+"id"+id);
}
public static int print(String s)
{
System.out.println(s);
return 20;
}
public static void main(String args[])
{
System.out.println("this is main");
Test test = new Test(5);
test.PRINT();
}
}
通過這個簡單的例子來回顧一下內存分配壕翩。
java中內存主要包含4塊:
heap(堆內存):除了基本類型的值靡挥,其他被new出來的變量都存儲在這里筋帖。
stack(棧內存):局部方法定義的變量都存儲在這里菠秒。方法作用域結束隆豹,變量之后會被垃圾收集機制搞定。
data segment:靜態(tài)變量或是常量存放區(qū)贼涩。
codesegment(方法區(qū)):存放方法巧涧。
剛才又查了查資料,發(fā)現(xiàn)這里面還有一些不知道知識遥倦。
靜態(tài)成員變量和靜態(tài)代碼塊與main函數(shù)的執(zhí)行先后順序是什么谤绳?
為此將代碼改成如此占锯。
執(zhí)行的結果是:
this is static variable x
this is main
sid: 0 id: 5
用下圖來說明內存分配過程:
1:①②③④⑤這幾個在main方法執(zhí)行前已經(jīng)預加載好了(它們之間的順序我還沒搞懂)。
2:執(zhí)行了靜態(tài)方法print缩筛。打印出this is static variable x消略。
3:main方法執(zhí)行,打印出this is main瞎抛。
4:在stack分配test存儲空間艺演,為構造方法在stack中分配臨時變量空間(構造方法結束,便消失)桐臊,完成對象初始化胎撤。
5:接著調用PRINT方法,打印断凶。