前言:這屬于 java 的基礎(chǔ)知識,你可以不了解,也可以不拿它當(dāng)一回事,代碼也一樣能敲的順暢;這是很久之前,我從 C++ 轉(zhuǎn) java 剛?cè)腴T那會的看法,那會我堅持自己的理念: 重實踐,講運用,輕理論。當(dāng)然,對同一樣事物,在不同階段也會有不一樣的看法,這理念在某個時段已經(jīng)不適合我,早就被拋棄了。不扯淡了,直接進入主題。java 中的變量大致分為 成員變量 和 局部變量 兩大類。成員變量: 在類體里面定義的變量稱為成員變量; 如果該成員變量有 static 關(guān)鍵字修飾,則該成員變量稱為 靜態(tài)變量 或 類變量; 如果該成員變量沒有 static 關(guān)鍵字修飾,則該成員變量被稱為 非靜態(tài)變量 或 實例變量。局部變量: 形參、方法內(nèi)定義的變量、代碼塊中定義的變量,都屬于局部變量。類變量 (靜態(tài)變量) 1. 可以向前引用 2. 變量屬于類本身 3. 類變量不依賴類的實例,類變量只在初始化時候在棧內(nèi)存中被分配一次空間,無論類的實例被創(chuàng)建幾次,都不再為類變量分配空間 4. 通過類的任意一個實例來訪問類變量,底層都將將其轉(zhuǎn)為通過類本身來訪問類變量,它們的效果是一樣的 5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值 6. 將在類的初始化之前初始化實例變量(非靜態(tài)變量) 1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的 2. 變量屬于類的實例對象 3. 隨著類的實例被創(chuàng)建而分配內(nèi)存空間非靜態(tài)代碼塊 直接由 { } 包起來的代碼,稱為非靜態(tài)代碼塊靜態(tài)代碼塊 直接由 static { } 包起來的代碼,稱為靜態(tài)代碼塊類變量(靜態(tài)變量)、實例變量(非靜態(tài)變量)、靜態(tài)代碼塊、非靜態(tài)代碼塊 的初始化時機 由 static 關(guān)鍵字修飾的(如:類變量[靜態(tài)變量]、靜態(tài)代碼塊)將在類被初始化創(chuàng)建實例對象之前被初始化,而且是按順序從上到下依次被執(zhí)行; 沒有 static 關(guān)鍵字修飾的(如:實例變量[非靜態(tài)變量]、非靜態(tài)代碼塊)初始化實際上是會被提取到類的構(gòu)造器中被執(zhí)行的,但是會比類構(gòu)造器中的 代碼塊優(yōu)先執(zhí)行到,其也是按順序從上到下依次被執(zhí)行。- 以上是本人在翻完 PDF 后的個人筆記和理解以及見解,不見得百分百對,以下附上本人測試示例代碼,會更有說服性示例代碼
后臺輸出結(jié)果
為了能更好的看出后臺的輸出是哪一行代碼執(zhí)行的結(jié)果,我用了 @和數(shù)字來做了標(biāo)記,希望大家不要看暈了哈 ^_^最后針對輸出結(jié)果簡單說一下:@1 說明,靜態(tài)(類變量、靜態(tài)代碼塊)屬于類本身,不依賴于類的實例@6 說明,在創(chuàng)建類的實例對象的時候,非靜態(tài)代碼塊比構(gòu)造器代碼塊更早的執(zhí)行@3 4 說明,當(dāng)類變量的值改變后,再通過類或類的實例來訪問類變量,得到的將是被改變后的值@5 說明,非靜態(tài)(實例變量、非靜態(tài)代碼塊)的地位是相等的,它們將按順序被執(zhí)行,但會比構(gòu)造器中的代碼塊更早的執(zhí)行
個人主頁
beanutil
jutil
jexcel
orc