簡介
JAVA在程序運行時,在內存中劃分5片空間進行數據的存儲。分別是:
- 寄存器。
- 本地方法區。
- 方法區。
- 棧。
- 堆。
棧stack和堆heap這兩個概念很重要
棧:
- 函數中定義的基本類型變量,對象的引用變量都在函數的棧內存中分配。
- 棧內存特點,數數據一執行完畢,變量會立即釋放,節約內存空間。
- 棧內存中的數據,沒有默認初始化值,需要手動設置。
堆:
- 堆內存用來存放new創建的對象和數組。
- 堆內存中所有的實體都有內存地址值。
- 堆內存中的實體是用來封裝數據的,這些數據都有默認初始化值。
- 堆內存中的實體不再被指向時,JVM啓動垃圾回收機制,自動清除,這也是JAVA優於C++的表現之一(C++中需要程序員手動清除)。
示例1
main()
int x=1;
show ()
int x=2
主函數main()中定義變量int x=1,show()函數中定義變量int x=1。最後show()函數執行完畢。
小編是一個有着5年工作經驗的java程序員,對於java,自己有做資料的整合,一個完整學習java的路線,學習資料和工具,相信這裏有很多學習java的小夥伴,我創立了一個2000人學習扣羣,479121291。每晚都有java的直播課程。無論是初級還是進階的小夥伴小編我都歡迎!
以上程序執行步驟:
第1步——main()函數是程序入口,JVM先執行,在棧內存中開闢一個空間,存放int類型變量x,同時附值1。
第2步——JVM執行show()函數,在棧內存中又開闢一個新的空間,存放int類型變量x,同時附值2。此時main空間與show空間並存,同時運行,互不影響。
第3步——show()執行完畢,變量x立即釋放,空間消失。但是main()函數空間仍存在,main中的變量x仍然存在,不受影響。
示意圖:
示例2
main()
int[] x=new int[3];
x[0]=20
主函數main()中定義數組x,元素類型int,元素個數3。
第1步——執行int[] x=new int[3];
JVM執行main()函數,在棧內存中開闢一個空間,存放x變量(x變量是局部變量)。同時,在堆內存中也開闢一個空間,存放new int[3]數組,堆內存會自動內存首地址值,如0x0045。
數組在棧內存中的地址值,會附給x,這樣x也有地址值。所以,x就指向(引用)了這個數組。此時,所有元素均未附值,但都有默認初始化值0。
第2步——執行x[0]=20 即在堆內存中將20附給[0]這個數組元素。這樣,數組的三個元素值分別爲20,0,0
示意圖:
示例3
Car c=new Car;
c.num=5;
Car c1=c;
c1.color="green";
c.run();
Car c1=c,這句話相當於將對象複製一份出來,兩個對象的內存地址值一樣。所以指向同一個實體,對c1的屬性修改,相當於c的屬性也改了。
示意圖: