本節(jié)可能令人感到不適,謹慎觀看(本節(jié)為編譯原理的引申節(jié))
上一個程序我們寫的時候,出現(xiàn)了一個關(guān)鍵字,static,這是什么東西呢?
static稱為靜態(tài),被它修飾的變量稱為靜態(tài)變量(也稱全局變量和類變量,之所以有這么多名字是觀察它的點不同)。
靜態(tài)變量:
靜態(tài)變量具有全局屬性,即一旦被靜態(tài)變量修飾,在本類的所有位置,均可使用,這也是靜態(tài)變量稱為全局變量的原因。這不同于普通變量,類屬性下的普通變量(也稱類的屬性)也要被普通方法使用需要this關(guān)鍵字,普通變量也不能被主方法直接使用(因為主方法是一個典型的靜態(tài)方法)
那為什么靜態(tài)變量右被稱為類變量?因為靜態(tài)變量是歸屬于類來初始化的,而普通變量歸屬于實例。所以其他類想使用本類的靜態(tài)屬性,只需類名.變量名即可。
ps:靜態(tài)變量還有一個注意點是,它是被所有本類實例共享的變量,這在下一次課上解釋了面向?qū)ο缶幊毯笤僮稣f明。
停,就到這了,剩下的不說了。
是不是聽的有點迷糊,那在加點料。
靜態(tài)方法:
上面提到主方法是靜態(tài)方法,在程序中顯而易見,main方法的確被static修飾過嘛。靜態(tài)方法有兩個特點。
1:同靜態(tài)變量,如果其他類想使用本類的靜態(tài)方法,只需類名.方法名即可。
2:靜態(tài)方法內(nèi)部不能使用普通變量(類的屬性)和普通方法,因此也不能使用this關(guān)鍵字。
ps:this關(guān)鍵字:本類方法調(diào)用本類屬性,或本類方法調(diào)用本類方法使用。
靜態(tài)代碼塊:
靜態(tài)代碼塊是指在類加載過程中,只會執(zhí)行一次的語句塊。
ps:所謂的類加載過程,其實是字節(jié)碼文件由jvm執(zhí)行并分配空間的過程。
需要注意的是,并不是生成了class文件,就一定會觸發(fā)類加載。
那么你是不是會有疑問,為什么static變量是全局的?為什么靜態(tài)代碼塊只執(zhí)行一次?為什么他們不需要創(chuàng)建實例就可以執(zhí)行?
有想了解的,可以看我寫的關(guān)于java代碼如何一步步被虛擬機執(zhí)行的,以及虛擬機在執(zhí)行時,各部分又干了什么?
3.jvm的類加載機制
4.虛擬機內(nèi)存圖解及字節(jié)碼執(zhí)行過程
從jvm的角度來分析靜態(tài)變量和靜態(tài)方法