引子:曾經(jīng)看見(jiàn)一句話,初學(xué)Java你就該知道static可以修飾方法和變量。學(xué)Java一年你就該知道靜態(tài)內(nèi)部類。學(xué)Java三年你就該知道靜態(tài)代碼塊担钮。
1.靜態(tài)變量
? Java中static只能修飾成員變量,不能修飾局部變量尤仍。靜態(tài)變量存儲(chǔ)于JVM內(nèi)存區(qū)的Method Area(方法區(qū))。static常與final一起使用狭姨,定義常量宰啦。
2.靜態(tài)方法
? 靜態(tài)方法在類定義的時(shí)候已經(jīng)被裝載和分配,靜態(tài)方法可以直接通過(guò)類名調(diào)用饼拍。靜態(tài)方法只能調(diào)用static修飾的成員變量和方法赡模,靜態(tài)方法不持有this引用。
3.靜態(tài)內(nèi)部類
? static修飾類的時(shí)候师抄,只能修飾內(nèi)部類漓柑。因?yàn)槟涿麅?nèi)部類和非靜態(tài)內(nèi)部類隱式的持有外部類的this引用,所以經(jīng)常在Android中使用來(lái)避免內(nèi)存泄露叨吮。單例模式可以通過(guò)靜態(tài)內(nèi)部類的方式構(gòu)造辆布,classloader的機(jī)制可以保證初始化instance時(shí)只有一個(gè)線程,所以也是線程安全的茶鉴。
4.靜態(tài)代碼塊
? 靜態(tài)代碼塊是在虛擬機(jī)加載類的時(shí)候執(zhí)行的锋玲,只執(zhí)行一次。如果有多個(gè)static代碼塊JVM將按照它們?cè)陬愔谐霈F(xiàn)的先后順序依次執(zhí)行它們涵叮。非靜態(tài)代碼塊是在類new一個(gè)實(shí)例的時(shí)候執(zhí)行惭蹂,而且是每次new對(duì)象實(shí)例都會(huì)執(zhí)行。
? ? 靜態(tài)代碼塊是主動(dòng)執(zhí)行的割粮,靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的盾碗。
5.靜態(tài)導(dǎo)入
? 靜態(tài)導(dǎo)入是JDK1.5之后的新特性∫ㄆ埃可以在導(dǎo)包的時(shí)候import static導(dǎo)入包也可以直接導(dǎo)入靜態(tài)方法廷雅。在使用的時(shí)候可以直接方法名調(diào)用。雖然靜態(tài)導(dǎo)包減少了代碼,但是犧牲了代碼的可讀性榜轿。使用的時(shí)候要慎重幽歼。