初始化順序總結 - 靜態變量、靜態代碼塊、成員變量、構造函數

https://www.cnblogs.com/abcjun/articles/4687539.html
概念
 
 
 
類變量 (靜態變量
    1. 可以向前引用
    2. 變量屬於類本身
    3. 類變量不依賴類的實例,類變量只在初始化時候在棧內存中被分配一次空間,無論類的實例被創建幾次,都不再爲類變量分配空間
    4. 通過類的任意一個實例來訪問類變量,底層都將將其轉爲通過類本身來訪問類變量,它們的效果是一樣的
    5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變後的值
    6. 將在類的初始化之前初始化

實例變量(非靜態變量)
    1. 不能向前引用,如果向前引用,則稱爲非法向前引用,這是不允許的
    2. 變量屬於類的實例對象
    3. 隨着類的實例被創建而分配內存空間

非靜態代碼塊
    直接由 { } 包起來的代碼,稱爲非靜態代碼塊

靜態代碼塊
    直接由 static { } 包起來的代碼,稱爲靜態代碼塊
 
 

 
Java初始化順序
類變量(靜態變量)、實例變量(非靜態變量)、靜態代碼塊、非靜態代碼塊 的初始化時機
由 static 關鍵字修飾的(如:類變量[靜態變量]、靜態代碼塊)將在類被初始化創建實例對象之前被初始化,而且是按順序從上到下依次被執行;
沒有 static 關鍵字修飾的(如:實例變量[非靜態變量]、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的代碼塊優先執行到,其也是按順序從上到下依次被執行。
  1. 在new B一個實例時首先要進行類的裝載。(類只有在使用New調用創建的時候纔會被java類裝載器裝入)

  2. 在裝載類時,先裝載父類A,再裝載子類B

  3. 裝載父類A後,完成靜態動作(包括靜態代碼和變量,它們的級別是相同的,按照代碼中出現的順序初始化)

  4. 裝載子類B後,完成靜態動作

類裝載完成,開始進行實例化

  1. 在實例化子類B時,先要實例化父類A2,實例化父類A時,先成員實例化(非靜態代碼)
  2. 父類A的構造方法
  3. 子類B的成員實例化(非靜態代碼)
  4. 子類B的構造方法

 

先初始化父類的靜態代碼—>初始化子類的靜態代碼–>初始化父類的非靜態代碼—>初始化父類構造函數—>初始化子類非靜態代碼—>初始化子類構造函數

 


 

 參考網站:

http://www.blogjava.net/fancydeepin/archive/2012/07/09/java_variable.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章