Java成員變量:
Java類在生成執行個體時,
jvm會在Java堆中配置設定一塊記憶體空間,
配置設定到的位址空間存儲所有的成員變量,
根據成員變量資料類型的不同,擁有不同的預設值,
執行個體如果有指派則會覆寫掉預設值,否則不做更改
——即,無論如何,屬性都會擁有初始值
Java局部變量(個人了解)
The local variable i may not have been initialized
Java局部變量在方法被調用,程式執行到局部變量聲明位置時,
會将變量類型、變量名稱、變量值(若是有值的話,預設不做填充)包裝成一個對象壓入棧中,
若是變量為基礎類型,直接在val位置存儲變量值,
若為引用類型,則先将對象存入Java堆中,再将堆中位址引用填進棧中val位置
這裡可以看到一個明顯差別:
成員變量,是伴随着對象的執行個體化,存儲在Java堆中,而在Java堆中位址空間是會根據存儲類型初始化的
局部變量,主體是在棧中,無論是何種類型資料,都要首先定位到棧中然後才能獲得Java堆的位置(如果是引用類型的話)
故而,造成兩者差别的原因在于,棧中資料不會執行初始化,而堆中資料會有初始化
總結:
成員變量依托于Java對象,生命周期相同,一起建立回收,生命周期相對較長
局部變量依托于方法調用,生命周期與方法的一次調用相同,生命周期短暫
成員變量存在很大程度的重用特性,
局部變量一次調用結束便可以判定死亡