Java類的載入順序,Java類載入順序
問題
昨天有人問我一個類中有靜態方法,有靜態代碼塊,普通代碼塊,建構函式,普通方法,靜態方法,那麼它們的載入順序是什嗎?如果有之類繼承該類,也有如上的方法,那麼載入順序又是如何?
執行個體1
普通方法StaticVar
package org.andy.test;/** * @author andy * @version:2015-2-4 上午10:52:32 * * */public class StaticVar { public StaticVar() { System.out.println("----StaticVar-----"); }}
測試載入方法OrderLoad
package org.andy.test;/** * @author andy * @version:2015-2-4 上午10:33:48 * * */public class OrderLoad {static{System.out.println("----OrderLoad靜態代碼塊-----");}private static StaticVar staticVar = new StaticVar();{System.out.println("----OrderLoad代碼塊-----");}public OrderLoad(){System.out.println("----OrderLoad建構函式-----");System.out.println(" ");}public static void staticFunction(){System.out.println("----OrderLoad靜態方法-----");}public void normalFunction(){System.out.println("----OrderLoad普通方法-----");}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubOrderLoad staticVar = new OrderLoad();OrderLoad.staticFunction();staticVar.normalFunction();}}
運行結果如下:
載入順序是:
靜態代碼塊-----靜態方法--------普通代碼塊-------構造方法-----------調用的方法(包括靜態方法和非靜態方法,按調用順序)
執行個體2
子類OrderLoadChild實現父類OrderLoad
package org.andy.test;/** * @author andy * @version:2015-2-4 上午11:33:51 * * */public class OrderLoadChild extends OrderLoad {static {System.out.println("----OrderLoadChild靜態代碼塊-----");}private static StaticVar staticVar = new StaticVar();{System.out.println("----OrderLoadChild代碼塊-----");}public OrderLoadChild(){System.out.println("----OrderLoadChild建構函式-----"); System.out.println(" ");}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubOrderLoadChild orderLoadChild = new OrderLoadChild();}}
運行結果如下:
載入順序是:
父類靜態塊-----父類靜態常量-------子類靜態塊----------子類靜態常量----------父類普通代碼塊------------父類構造方法------------子類代碼塊------------子類構造方法
類的載入順序1、靜態代碼塊/靜態成員
靜態代碼塊/靜態成員最先載入。
靜態代碼塊/靜態成員順序按照代碼書寫先後順序載入。
如父類有靜態代碼塊/靜態成員,先調用父類靜態代碼塊/靜態成員(Object最優先),再一次載入本類的靜態代碼塊/靜態成員。
2、普通代碼塊/非靜態成員
同一類中普通代碼塊/非靜態成員順序在靜態代碼塊/靜態成員載入之後。
同一類中多段普通代碼塊/非靜態成員載入順序按照代碼書寫先後載入。
如父類有普通代碼塊/非靜態成員,現在載入父類的普通代碼塊/非靜態成員,在載入子類的普通代碼塊/非靜態成員。
3、構造方法
同一類中構造方法次於代碼塊之後載入。
同一類中如果有多個構造方法,按照執行個體時所調用的載入。
先載入父類的構造方法,在載入子類的構造方法。
子類的普通代碼塊/非靜態成員載入順序低於父類建構函式的載入順序。
4、靜態方法/普通方法
調用時才載入。
總結:
先載入父類的靜態代碼塊/靜態成員(父類中中都有或有多個有,按書寫順序) ------------- 載入子類的靜態代碼塊/靜態成員(字類中都有或有多個,按書寫順序)---------父類的普通代碼塊/非靜態成員(父類中中都有或有多個有,按書寫順序)------------父類的構造方法-----------------子類的普通代碼塊/非靜態成員(字類中都有或有多個,按書寫順序)-----------子類的構造方法