1.Java中靜態變量只能在類主體中定義,不能在方法中定義。 靜態變量屬於類所有而不屬於方法。
2. 靜態塊:用static申明,JVM加載類時執行,僅執行一次
構造塊:類中直接用{}定義,每一次創建對象時執行
執行順序優先級:靜態塊>main()>構造塊>構造方法
3. 類的加載順序
(1) 父類靜態對象和靜態代碼塊
(2) 子類靜態對象和靜態代碼塊
(3) 父類非靜態對象和非靜態代碼塊
(4) 父類構造函數
(5) 子類 非靜態對象和非靜態代碼塊
(6) 子類構造函數
4.例子(看了一目了然)
1 class Root{ 2 static { 3 System.out.println("Root的靜態初始化塊。"); 4 } 5 { 6 System.out.println("Root的普通初始化塊。"); 7 } 8 public Root(){ 9 System.out.println("Root的無參構造函數。"); 10 } 11 } 12 13 class Mid extends Root{ 14 static { 15 System.out.println("Mid的靜態初始化塊。"); 16 } 17 { 18 System.out.println("Mid的普通初始化塊。"); 19 } 20 public Mid() { 21 System.out.println("Mid的無參構造函數。"); 22 } 23 public Mid(String msg) { 24 System.out.println("Mid的帶參數構造函數,參數值為:" + msg); 25 } 26 } 27 28 class Leaf extends Mid{ 29 static { 30 System.out.println("Leaf的靜態初始化塊。"); 31 } 32 { 33 System.out.println("Leaf的普通初始化塊。"); 34 } 35 public Leaf() { 36 super("Leaf傳給Mid"); 37 System.out.println("執行Leaf的構造函數。"); 38 } 39 } 40 41 42 public class staticTest { 43 public static void main(String[] args) { 44 new Leaf(); 45 new Leaf(); 46 } 47 }
執行結果
注意:
靜態初始化塊僅在第一次使用類時執行初始化操作。上面例子中,第二次創建Leaf對象是,靜態初始化塊並沒有執行。