更新時間:2020-03-03 10:17:49 來源:動力節點 瀏覽2019次
靜態變量和靜態方法
static關鍵字最基本的用法是:
1、被static修飾的變量屬于類變量,可以通過類名.變量名直接引用,而不需要new出一個類來
2、被static修飾的方法屬于類方法,可以通過類名.方法名直接引用,而不需要new出一個類來
被static修飾的變量、被static修飾的方法統一屬于類的靜態資源,是類實例之間共享的,換言之,一處變、處處變。JDK把不同的靜態資源放在了不同的類中而不把所有靜態資源放在一個類里面,很多人可能想當然認為當然要這么做,但是是否想過為什么要這么做呢?個人認為主要有三個好處:
1、不同的類有自己的靜態資源,這可以實現靜態資源分類。比如和數學相關的靜態資源放在java.lang.Math中,和日歷相關的靜態資源放在java.util.Calendar中,這樣就很清晰了
2、避免重名。不同的類之間有重名的靜態變量名、靜態方法名也是很正常的,如果所有的都放在一起不可避免的一個問題就是名字重復,這時候怎么辦?分類放置就好了。
3、避免靜態資源類無限膨脹,這很好理解。
OK,再微微深入一下,也是有些人容易混淆的一個問題:靜態方法能不能引用非靜態資源?靜態方法里面能不能引用靜態資源?非靜態方法里面能不能引用靜態資源?比如就以這段代碼為例,是否有錯?
當然有錯,在第7行的地方。不妨這么思考這個問題:
靜態資源屬于類,但是是獨立于類存在的。從JVM的類加載機制的角度講,靜態資源是類初始化的時候加載的,而非靜態資源是類new的時候加載的。類的初始化早于類的new,比如Class.forName(“xxx”)方法,就是初始化了一個類,但是并沒有new它,只是加載這個類的靜態資源罷了。所以對于靜態資源來說,它是不可能知道一個類中有哪些非靜態資源的;但是對于非靜態資源來說就不一樣了,由于它是new出來之后產生的,因此屬于類的這些東西它都能認識。所以上面的幾個問題答案就很明確了:
1、靜態方法能不能引用非靜態資源?不能,new的時候才會產生的東西,對于初始化后就存在的靜態資源來說,根本不認識它。
2、靜態方法里面能不能引用靜態資源?可以,因為都是類初始化的時候加載的,大家相互都認識。
3、非靜態方法里面能不能引用靜態資源?可以,非靜態方法就是實例方法,那是new之后才產生的,那么屬于類的內容它都認識。
靜態塊
靜態塊也是static的重要應用之一。也是用于初始化一個類的時候做操作用的,和靜態變量、靜態方法一樣,靜態塊里面的代碼只執行一次,且只在初始化類的時候執行。靜態塊很簡單,不過提三個小細節:
打印結果是:
得出第一個結論:靜態資源的加載順序是嚴格按照靜態資源的定義順序來加載的。這和周志明老師《深入理解Java虛擬機:JVM高級特性與最佳實踐》中類初始化中的說法“<clinit>()方法是由編譯器自動收集類中所有類變量的賦值動作和靜態語句塊(static{}塊)中的語句合并產生的,編譯器收集的順序是由語句在源文件中出現的順序所決定的”是一致的。
以上就是動力節點Java培訓機構小編介紹的“Javase教程全集:static關鍵字作用”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習