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