概念

類變量 (靜態變量)
1. 可以向前引用
2. 變量屬於類本身
3. 類變量不依賴類的實例,類變量只在初始化時候在棧內存中被分配一次空間,無論類的實例被創建幾次,都不再為類變量分配空間
4. 通過類的任意一個實例來訪問類變量,底層都將將其轉為通過類本身來訪問類變量,它們的效果是一樣的
5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值
6. 將在類的初始化之前初始化
實例變量(非靜態變量)
1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
2. 變量屬於類的實例對象
3. 隨着類的實例被創建而分配內存空間
非靜態代碼塊
直接由 { } 包起來的代碼,稱為非靜態代碼塊
靜態代碼塊
直接由 static { } 包起來的代碼,稱為靜態代碼塊
1. 可以向前引用
2. 變量屬於類本身
3. 類變量不依賴類的實例,類變量只在初始化時候在棧內存中被分配一次空間,無論類的實例被創建幾次,都不再為類變量分配空間
4. 通過類的任意一個實例來訪問類變量,底層都將將其轉為通過類本身來訪問類變量,它們的效果是一樣的
5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值
6. 將在類的初始化之前初始化
實例變量(非靜態變量)
1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
2. 變量屬於類的實例對象
3. 隨着類的實例被創建而分配內存空間
非靜態代碼塊
直接由 { } 包起來的代碼,稱為非靜態代碼塊
靜態代碼塊
直接由 static { } 包起來的代碼,稱為靜態代碼塊
Java初始化順序
類變量(靜態變量)、實例變量(非靜態變量)、靜態代碼塊、非靜態代碼塊 的初始化時機
由 static 關鍵字修飾的(如:類變量[靜態變量]、靜態代碼塊)將在類被初始化創建實例對象之前被初始化,而且是按順序從上到下依次被執行;
沒有 static 關鍵字修飾的(如:實例變量[非靜態變量]、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的代碼塊優先執行到,其也是按順序從上到下依次被執行。
-
在new B一個實例時首先要進行類的裝載。(類只有在使用New調用創建的時候才會被java類裝載器裝入)
-
在裝載類時,先裝載父類A,再裝載子類B
-
裝載父類A后,完成靜態動作(包括靜態代碼和變量,它們的級別是相同的,按照代碼中出現的順序初始化)
-
裝載子類B后,完成靜態動作
類裝載完成,開始進行實例化
- 在實例化子類B時,先要實例化父類A2,實例化父類A時,先成員實例化(非靜態代碼)
- 父類A的構造方法
- 子類B的成員實例化(非靜態代碼)
- 子類B的構造方法
先初始化父類的靜態代碼--->初始化子類的靜態代碼-->初始化父類的非靜態代碼--->初始化父類構造函數--->初始化子類非靜態代碼--->初始化子類構造函數
參考網站:
http://www.blogjava.net/fancydeepin/archive/2012/07/09/java_variable.html