Java初始化順序
1在new B一個實例時首先要進行類的裝載。(類只有在使用New調用創建的時候才會被java類裝載器裝入)
2,在裝載類時,先裝載父類A,再裝載子類B
3,裝載父類A后,完成靜態動作(包括靜態代碼和變量,它們的級別是相同的,安裝代碼中出現的順序初始化)
4,裝載子類B后,完成靜態動作
類裝載完成,開始進行實例化
1,在實例化子類B時,先要實例化父類A
2,實例化父類A時,先成員實例化(非靜態代碼)
3,父類A的構造方法
4,子類B的成員實例化(非靜態代碼)
5,子類B的構造方法
先初始化父類的靜態代碼--->初始化子類的靜態代碼-->初始化父類的非靜態代碼--->初始化父類構造函數--->初始化子類非靜態代碼--->初始化子類構造函數
測試代碼:
abstract class base { public int age=getNumber(100); static{ System.out.println("base static block"); } { System.out.println("base nonstatic block"); } static int sage=getNumber(50); base(){ System.out.println(age); System.out.println("base start"); draw();//會調用子類覆蓋后的方法,這兒是0! System.out.println("base end"); } static int getNumber(int base){ System.out.println("base.getNumber int"+base); return base; } public void draw(){ System.out.println("base.draw"); } } public class initializeOrder extends base{ public int age=getNumber(1001); private int _radius=getNumber(10); static int sage=getNumber(250); static{ System.out.println("subclass static block"); } { System.out.println("subclass nonstatic block"); } initializeOrder(int radius){ _radius=radius; System.out.println(age); draw();//這兒是1000 System.out.println("initializeOrder initialized"); } public void draw(){ System.out.println("initializeOrder.draw "+_radius); } public static void main(String[] args) { // TODO Auto-generated method stub new initializeOrder(1000); } }
輸出為:
base static block
base.getNumber int50
base.getNumber int250
subclass static block
base.getNumber int100
base nonstatic block
100
base start
initializeOrder.draw 0
base end
base.getNumber int1001
base.getNumber int10
subclass nonstatic block
1001
initializeOrder.draw 1000
initializeOrder initialized