更新時(shí)間:2020-03-03 10:17:49 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2371次
靜態(tài)變量和靜態(tài)方法
static關(guān)鍵字最基本的用法是:
1、被static修飾的變量屬于類變量,可以通過類名.變量名直接引用,而不需要new出一個(gè)類來(lái)
2、被static修飾的方法屬于類方法,可以通過類名.方法名直接引用,而不需要new出一個(gè)類來(lái)
被static修飾的變量、被static修飾的方法統(tǒng)一屬于類的靜態(tài)資源,是類實(shí)例之間共享的,換言之,一處變、處處變。JDK把不同的靜態(tài)資源放在了不同的類中而不把所有靜態(tài)資源放在一個(gè)類里面,很多人可能想當(dāng)然認(rèn)為當(dāng)然要這么做,但是是否想過為什么要這么做呢?個(gè)人認(rèn)為主要有三個(gè)好處:
1、不同的類有自己的靜態(tài)資源,這可以實(shí)現(xiàn)靜態(tài)資源分類。比如和數(shù)學(xué)相關(guān)的靜態(tài)資源放在java.lang.Math中,和日歷相關(guān)的靜態(tài)資源放在java.util.Calendar中,這樣就很清晰了
2、避免重名。不同的類之間有重名的靜態(tài)變量名、靜態(tài)方法名也是很正常的,如果所有的都放在一起不可避免的一個(gè)問題就是名字重復(fù),這時(shí)候怎么辦?分類放置就好了。
3、避免靜態(tài)資源類無(wú)限膨脹,這很好理解。
OK,再微微深入一下,也是有些人容易混淆的一個(gè)問題:靜態(tài)方法能不能引用非靜態(tài)資源?靜態(tài)方法里面能不能引用靜態(tài)資源?非靜態(tài)方法里面能不能引用靜態(tài)資源?比如就以這段代碼為例,是否有錯(cuò)?

當(dāng)然有錯(cuò),在第7行的地方。不妨這么思考這個(gè)問題:
靜態(tài)資源屬于類,但是是獨(dú)立于類存在的。從JVM的類加載機(jī)制的角度講,靜態(tài)資源是類初始化的時(shí)候加載的,而非靜態(tài)資源是類new的時(shí)候加載的。類的初始化早于類的new,比如Class.forName(“xxx”)方法,就是初始化了一個(gè)類,但是并沒有new它,只是加載這個(gè)類的靜態(tài)資源罷了。所以對(duì)于靜態(tài)資源來(lái)說,它是不可能知道一個(gè)類中有哪些非靜態(tài)資源的;但是對(duì)于非靜態(tài)資源來(lái)說就不一樣了,由于它是new出來(lái)之后產(chǎn)生的,因此屬于類的這些東西它都能認(rèn)識(shí)。所以上面的幾個(gè)問題答案就很明確了:
1、靜態(tài)方法能不能引用非靜態(tài)資源?不能,new的時(shí)候才會(huì)產(chǎn)生的東西,對(duì)于初始化后就存在的靜態(tài)資源來(lái)說,根本不認(rèn)識(shí)它。
2、靜態(tài)方法里面能不能引用靜態(tài)資源?可以,因?yàn)槎际穷惓跏蓟臅r(shí)候加載的,大家相互都認(rèn)識(shí)。
3、非靜態(tài)方法里面能不能引用靜態(tài)資源?可以,非靜態(tài)方法就是實(shí)例方法,那是new之后才產(chǎn)生的,那么屬于類的內(nèi)容它都認(rèn)識(shí)。
靜態(tài)塊
靜態(tài)塊也是static的重要應(yīng)用之一。也是用于初始化一個(gè)類的時(shí)候做操作用的,和靜態(tài)變量、靜態(tài)方法一樣,靜態(tài)塊里面的代碼只執(zhí)行一次,且只在初始化類的時(shí)候執(zhí)行。靜態(tài)塊很簡(jiǎn)單,不過提三個(gè)小細(xì)節(jié):

打印結(jié)果是:

得出第一個(gè)結(jié)論:靜態(tài)資源的加載順序是嚴(yán)格按照靜態(tài)資源的定義順序來(lái)加載的。這和周志明老師《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》中類初始化中的說法“<clinit>()方法是由編譯器自動(dòng)收集類中所有類變量的賦值動(dòng)作和靜態(tài)語(yǔ)句塊(static{}塊)中的語(yǔ)句合并產(chǎn)生的,編譯器收集的順序是由語(yǔ)句在源文件中出現(xiàn)的順序所決定的”是一致的。
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Javase教程全集:static關(guān)鍵字作用”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)