天天看點

Java内部初始化類成員變量,局部變量不執行初始化

Java成員變量:

Java類在生成執行個體時,

jvm會在Java堆中配置設定一塊記憶體空間,

配置設定到的位址空間存儲所有的成員變量,

根據成員變量資料類型的不同,擁有不同的預設值,

執行個體如果有指派則會覆寫掉預設值,否則不做更改

——即,無論如何,屬性都會擁有初始值

Java局部變量(個人了解)

Java内部初始化類成員變量,局部變量不執行初始化
The local variable i may not have been initialized
           

Java局部變量在方法被調用,程式執行到局部變量聲明位置時,

會将變量類型、變量名稱、變量值(若是有值的話,預設不做填充)包裝成一個對象壓入棧中,

若是變量為基礎類型,直接在val位置存儲變量值,

若為引用類型,則先将對象存入Java堆中,再将堆中位址引用填進棧中val位置

這裡可以看到一個明顯差別:

成員變量,是伴随着對象的執行個體化,存儲在Java堆中,而在Java堆中位址空間是會根據存儲類型初始化的

局部變量,主體是在棧中,無論是何種類型資料,都要首先定位到棧中然後才能獲得Java堆的位置(如果是引用類型的話)

故而,造成兩者差别的原因在于,棧中資料不會執行初始化,而堆中資料會有初始化

總結:

成員變量依托于Java對象,生命周期相同,一起建立回收,生命周期相對較長

局部變量依托于方法調用,生命周期與方法的一次調用相同,生命周期短暫

成員變量存在很大程度的重用特性,

局部變量一次調用結束便可以判定死亡