靜態(tài)變量和靜態(tài)辦法
static關(guān)鍵字最基本的用法是:
1、被static潤飾的變量歸于類變量,能夠經(jīng)過類名.變量名直接引證,而不需要new出一個類來
2、被static潤飾的辦法歸于類辦法,能夠經(jīng)過類名.辦法名直接引證,而不需要new出一個類來
被static潤飾的變量、被static潤飾的辦法統(tǒng)一歸于類的靜態(tài)資源,是類實例之間共享的,換言之,一處變、處處變。JDK把不同的靜態(tài)資源放在了不同的類中而不把一切靜態(tài)資源放在一個類里邊,很多人或許想當然認為當然要這么做,可是是否想過為什么要這么做呢?個人認為主要有三個好處:
1、不同的類有自己的靜態(tài)資源,這能夠?qū)崿F(xiàn)靜態(tài)資源分類。比方和數(shù)學相關(guān)的靜態(tài)資源放在java.lang.Math中,和日歷相關(guān)的靜態(tài)資源放在java.util.Calendar中,這樣就很清晰了
2、防止重名。不同的類之間有重名的靜態(tài)變量名、靜態(tài)辦法名也是很正常的,如果一切的都放在一同不可防止的一個問題便是姓名重復,這時分怎么辦?分類放置就好了。
3、防止靜態(tài)資源類無限脹大,這很好了解。
OK,再微微深化一下,也是有些人簡單混淆的一個問題:靜態(tài)辦法能不能引證非靜態(tài)資源?靜態(tài)辦法里邊能不能引證靜態(tài)資源?非靜態(tài)辦法里邊能不能引證靜態(tài)資源?比方就以這段代碼為例,是否有錯?
當然有錯,在第7行的當?shù)亍o妨這么思考這個問題:
靜態(tài)資源歸于類,可是是獨立于類存在的。從JVM的類加載機制的角度講,靜態(tài)資源是類初始化的時分加載的,而非靜態(tài)資源是類new的時分加載的。類的初始化早于類的new,比方Class.forName(“xxx”)辦法,便是初始化了一個類,可是并沒有new它,僅僅加載這個類的靜態(tài)資源罷了。所以關(guān)于靜態(tài)資源來說,它是不或許知道一個類中有哪些非靜態(tài)資源的;可是關(guān)于非靜態(tài)資源來說就不相同了,由于它是new出來之后發(fā)生的,因此歸于類的這些東西它都能知道。所以上面的幾個問題答案就很明確了:
1、靜態(tài)辦法能不能引證非靜態(tài)資源?不能,new的時分才會發(fā)生的東西,關(guān)于初始化后就存在的靜態(tài)資源來說,底子不知道它。
2、靜態(tài)辦法里邊能不能引證靜態(tài)資源?能夠,因為都是類初始化的時分加載的,我們相互都知道。
3、非靜態(tài)辦法里邊能不能引證靜態(tài)資源?能夠,非靜態(tài)辦法便是實例辦法,那是new之后才發(fā)生的,那么歸于類的內(nèi)容它都知道。
靜態(tài)塊
靜態(tài)塊也是static的重要應(yīng)用之一。也是用于初始化一個類的時分做操效果的,和靜態(tài)變量、靜態(tài)辦法相同,靜態(tài)塊里邊的代碼只履行一次,且只在初始化類的時分履行。靜態(tài)塊很簡單,不過提三個小細節(jié):
打印結(jié)果是:
得出第一個定論:靜態(tài)資源的加載次序是嚴厲按照靜態(tài)資源的界說次序來加載的。這和周志明教師《深化了解Java虛擬機:JVM高檔特性與最佳實踐》中類初始化中的說法“()辦法是由編譯器自動搜集類中一切類變量的賦值動作和靜態(tài)句子塊(static{}塊)中的句子合并發(fā)生的,編譯器搜集的次序是由句子在源文件中出現(xiàn)的次序所決定的”是共同的。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號