JAVA Static關(guān)鍵字的理解

static在日常開發(fā)過程中不可避免的一個關(guān)鍵字,也是面試中經(jīng)常被提及的一個基礎(chǔ)知識。對static的認識印象中只有四個部分:修飾變量,修飾方法,靜態(tài)代碼塊,靜態(tài)導入包。其他開發(fā)中暫未用過,理解起來也比較容易。



static理解

static字面意思“靜態(tài)”或者“全局”,在Java中并不存在真正的全局變量,而static可以起到“偽全局”的作用,static常用來修飾成員變量,修飾方法,修飾代碼塊,靜態(tài)導入包。

理解static需要了解Java 棧堆內(nèi)存劃分,以及JVM classloader加載機制。
Java把內(nèi)存分為棧內(nèi)存和堆內(nèi)存,棧內(nèi)存主要存放一些基本類型的變量,數(shù)組和對象的引用之類。而堆內(nèi)存則用來存放對象。
JVM加載一個類時,如果該類包含static修飾的成員變量或方法以及包含static修飾的代碼塊,則在類加載時會在固定的位置開辟固定大小的內(nèi)存(靜態(tài)存儲區(qū))來存放這些靜態(tài)變量和方法,以及執(zhí)行static代碼塊包含的內(nèi)容。這樣JVM就可以非常方便的去訪問這些靜態(tài)存儲區(qū)的內(nèi)容了,這樣是為什么static修飾的成員變量和方法,可以在不依賴于任何實例就可以使用類來調(diào)用。但這也導致了所有實例的引用都指向同一個地方,任何一個實例對其的修改都會導致其他實例的變化。
JVM一旦對類完成加載,之后在進行類實例化或者調(diào)用類的靜態(tài)成員變量時,便不再會對static修飾的成員變量和代碼塊進行多次初始化。相對于非靜態(tài)成員變量,每次實例化類時都會對該變量進行初始化。

static使用

static修飾的變量稱之靜態(tài)變量,可以直接通過className.propertyName方式使用,相對非靜態(tài)變量,JVM在分配內(nèi)存時,只會為靜態(tài)變量分配一次,所有類的實例共享該變量。相對非靜態(tài)變量,則是伴隨對象實例的創(chuàng)建而多次初始化變量并分配內(nèi)存。

注意:靜態(tài)變量是被GC作為root根節(jié)點存在的,也就是這類變量基本不會被回收,而非靜態(tài)變量則跟隨實例生命周期會被回收。所以當你使用一個靜態(tài)變量是要注意防止內(nèi)存泄漏。

static修飾的方法,使用起來較為方便直接通過className.methodName()來使用,在類加載完成時,該方法已經(jīng)存在了,不依賴于實例,所以static修飾的方法必須被實現(xiàn),不能是abstract抽象方法,必須包含方法體。

注意:靜態(tài)方法中不能使用非靜態(tài)成員變量和方法。原因很好理解:static修飾的方法在類加載后未被實例化即可被使用,而非靜態(tài)成員變量和方法則依賴于類實例。

static修飾代碼塊,可以把一些static修飾的成員變量和方法,放在一起用static去修飾。使用起來跟static修飾的方法沒有區(qū)別,說一下bean在初始化時變量的順序。


user類
staticUser類
執(zhí)行結(jié)果

不難看出,當我們直接調(diào)用類的靜態(tài)方法時,會觸發(fā)該類的static變量的初始化,而且在后續(xù)繼續(xù)創(chuàng)建實例時不會再次對static變量進行多次實例化。而非static在未實例化對象時不會進行初始化,而存在多個static變量時則是按照順序進行初始化,有興趣可以把static代碼塊調(diào)整位置執(zhí)行結(jié)果會時按照先后順序執(zhí)行。隨著創(chuàng)建多個實例可以發(fā)現(xiàn),非static變量則會在每次創(chuàng)建實例時進行多次初始化。

static靜態(tài)導入

import static是Java1.5加入的特性之一,一般static修飾方法多放于工具類中,因為這樣可以避免多次實例化對象去調(diào)用方法,造成資源浪費。當我們在一個類中大量使用某些靜態(tài)方法時,可以嘗試靜態(tài)導入該類的所有靜態(tài)方法。這樣就會變得很方便的直接使用方法不需要再className.methodName()去調(diào)用,直接methodName()使用即可,如果你只是用一兩次則無需這么做,看個人喜好。

注意:當使用靜態(tài)導入類的方法時要避免和本類的方法重名,否則無法使用。

以上就是對static的認識,如有不妥,請留言指正。轉(zhuǎn)載請注明地址!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容