標籤:ack 靜態代碼塊 類靜態變數 父類 print 函數 void ora 靜態
使用情境: 在java程式中,當執行個體化對象時,對象的所在類的所有成員變數首先要進行初始化,只有當所有類成員完成初始化後,
才會調用對象所在類的建構函式建立對象。
初始化的原則:
(1)靜態對象優先於非靜態對象初始化,靜態對象只能初始化一次,但非靜態對象可以初始化多次。
(2)超類優先於衍生類別初始化。
(3)按照成員變數定義的順序來進行初始化,即使變數定義散佈於方法定義之中,它們仍然在任何方法(包括構造器)被調用前初始化。
package test;/*java程式初始化的順序:超類靜態變數 超類靜態代碼塊 子類靜態變數 子類靜態代碼塊 * 超類非靜態變數 超類非靜態代碼塊 超類建構函式 子類非靜態代碼塊 子類非靜態代碼塊 * 子類建構函式*/class Base { static { System.out.println("父類靜態塊");//(1) } { System.out.println("父類塊");//(3) } public Base() { System.out.println("父類構造方法");//(4) } public static void A() { int a;//靜態方法中不能有靜態常量,因為static方法共用一塊記憶體地區,主要用於累加,如果靜態常量的常量話就不能累加了,就衝突了 System.out.println("父類普通靜態方法"); } }public class Derived extends Base { static int a=1; static int b=2; static { System.out.println("子類靜態塊");//(2) } { System.out.println("子類塊");//(5) } public Derived() { System.out.println("子類構造器");//(6) } public static void main(String[] args) { Base.A(); new Derived(); }}/* *public static void main(String[] args) { new Derived(); Base.A(); }父類靜態塊子類靜態塊父類塊父類構造方法子類塊子類構造器父類普通靜態方法*//* *public static void main(String[] args) { Base.A(); new Derived(); } 父類靜態塊子類靜態塊父類普通靜態方法父類塊父類構造方法子類塊子類構造器 * */
java程式初始化順序