1. 程式人生 > >java成員變數和區域性變數的初始化和記憶體中的執行機制

java成員變數和區域性變數的初始化和記憶體中的執行機制

成員變數:

  當系統載入類或建立類的例項時,系統會自動為成員變數分配記憶體空間,並在分配記憶體空間後,自動為成員變數指定初始值。


eyeNum是類屬性。name是例項屬性

所有person例項訪問eyeNum都將訪問person類的eyeNum屬性。訪問的是同一塊記憶體。如果通過例項修改類屬性,所有例項訪問時都會改變。

區域性變數:

區域性變數定義後,必須經過顯示初始化才能使用。這意味著定義了局部變數後,系統並未為這個變數分配記憶體空間,直到等到程式為這個變數賦值初始值時,系統才會給區域性變數分配記憶體,並將初始值儲存到這塊記憶體中。

  與成員變數不同,區域性變數不屬於任何類或例項,因此它總是儲存在其所在方法的棧記憶體中。

如果區域性變數是基本型別變數,則直接把變數值存放在棧中,如果是引用型別,則存放地址在棧中。

棧記憶體中的變數無須系統垃圾回收,變數是隨方法或程式碼塊的執行結束而結束的。因此,區域性變數的作用域是從初始化該變數開始,知道該方法或該程式碼塊執行完成而結束。因為區域性變數只儲存基本型別的值或物件的引用,因此區域性變數所佔的記憶體通常較小。

當我們定義一個成員變數時,成員變數將被放置到堆記憶體中,成員變數的作用域將擴大到類存在範圍或者物件存在範圍。這種範圍擴大有兩個壞處:

1,增大了變數的生存時間,將導致更大的系統開銷

2,擴大了作用域,不利於程式的內聚性。