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