java程式的初始化順序
阿新 • • 發佈:2021-07-17
使用場景
在java程式中,當例項化物件時,物件的所在類的所有成員變數首先要進行初始化,只有當所有類成員完成初始化後,才會呼叫物件所在類的建構函式建立物件。
原則
變數優先於塊、靜態優先於非靜態。
父類優先於派生類初始化。
按照成員變數定義的順序來進行初始化,即使變數定義散佈於方法定義之中,它們仍然在任何方法(包括構造器)被呼叫前初始化。
初始化順序
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態程式碼塊
父類非靜態變數
父類非靜態程式碼塊
父類建構函式
子類非靜態變數
子類非靜態程式碼塊
子類建構函式
初始化示例程式碼
class Base { public Base() { System.out.println("父類構造方法"); } String b = "父類非靜態變數"; { System.out.println(b); System.out.println("父類非靜態程式碼塊"); } static String a = "父類靜態變數"; static { System.out.println(a); System.out.println("父類靜態程式碼塊"); } public static void A() { System.out.println("父類普通靜態方法"); } } class Derived extends Base { public Derived() { System.out.println("子類構造器"); } String b = "子類非靜態變數"; { System.out.println(b); System.out.println("子類非靜態程式碼塊"); } static String a = "子類靜態變數"; static { System.out.println(a); System.out.println("子類靜態塊"); } public static void A() { System.out.println("子類普通靜態方法"); } public static void main(String[] args) { Base.A(); Derived.A(); new Derived(); } }
分別執行主函式裡的三條指令,執行結果如下。
Base.A()
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態塊
父類普通靜態方法
Derived.A()
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態塊
子類普通靜態方法
new Derived()
父類靜態變數
父類靜態程式碼塊
子類靜態變數
子類靜態程式碼塊
父類非靜態變數
父類非靜態程式碼塊
父類建構函式
子類非靜態變數
子類非靜態程式碼塊
子類建構函式