程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 淺談Java變量的初始化順序詳解

淺談Java變量的初始化順序詳解

編輯:JAVA編程入門知識

規則1(無繼承情況下):
對於靜態變量、靜態初始化塊、變量、初始化塊、構造器,它們的初始化順序依次是
(靜態變量、靜態初始化塊)>(變量、初始化塊)>構造器
證明代碼:
代碼如下:

public class InitialOrderTest {
    // 靜態變量
    public static String staticField = "靜態變量";
    // 變量
    public String field = "變量";
    // 靜態初始化塊
    static {
        System.out.println(staticField);
        System.out.println("靜態初始化塊");
    }
    // 初始化塊
    {
        System.out.println(field);
        System.out.println("初始化塊");
    }
    // 構造器
    public InitialOrderTest() {
        System.out.println("構造器");
    }
    public static void main(String[] args) {
        new InitialOrderTest();
    }
}

結果顯示:
靜態變量
靜態初始化塊
變量
初始化塊
構造器

規則2(有繼承情況下):
子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成
代碼如下:

class Parent {
    // 靜態變量
    public static String p_StaticField = "父類--靜態變量";
    // 變量
    public String p_Field = "父類--變量";
    // 靜態初始化塊
    static {
        System.out.println(p_StaticField);
        System.out.println("父類--靜態初始化塊");
    }
    // 初始化塊
    {
        System.out.println(p_Field);
        System.out.println("父類--初始化塊");
    }
    // 構造器
    public Parent() {
        System.out.println("父類--構造器");
    }
}//如果你想把這兩個類放在同一個文件且名字起為SubClass, 父類前不能加public
public class SubClass extends Parent { 
    // 靜態變量
    public static String s_StaticField = "子類--靜態變量";
    // 變量
    public String s_Field = "子類--變量";
    // 靜態初始化塊
    static {
        System.out.println(s_StaticField);
        System.out.println("子類--靜態初始化塊");
    }
    // 初始化塊
    {
        System.out.println(s_Field);
        System.out.println("子類--初始化塊");
    }
    // 構造器
    public SubClass() {
        System.out.println("子類--構造器");
    }
    // 程序入口
    public static void main(String[] args) {
        new SubClass();
    }
}

結果顯示:
父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
父類--變量
父類--初始化塊
父類--構造器
子類--變量
子類--初始化塊
子類--構造器

規則2(靜態變量和靜態初始化塊):
靜態變量和靜態初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變量和初
始化塊也遵循這個規律。
代碼如下:

public class testOrder {
    // 靜態變量
    public static TestA a = new TestA();
    public TestC c = new TestC();
    // 靜態變量
    public static TestB b = new TestB();
    public testOrder(){
        System.out.println("in constract");
    }
    // 靜態初始化塊
    static {
        System.out.println("靜態初始化塊");
    }
    public static void main(String[] args) {
        new testOrder();
    }
}
class TestA {
    public TestA() {
        System.out.println("Test--A");
    }
}
class TestB {
    public TestB() {
        System.out.println("Test--B");
    }
}
class TestC {
    public TestC() {
        System.out.println("Test--C");
    }
}

結果顯示:
Test--A
Test--B
靜態初始化塊
Test--C
in constract

個人總結:
先靜後動,先父後子,從上到下,先變量後構造

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved