問題
昨天有人問我一個類中有靜態方法,有靜態代碼塊,普通代碼塊,構造函數,普通方法,靜態方法,那麼它們的加載順序是什麼?如果有之類繼承該類,也有如上的方法,那麼加載順序又是如何?
實例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 stub
OrderLoad 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 stub
OrderLoadChild orderLoadChild = new OrderLoadChild();
}
}
運行結果如下:
加載順序是:
父類靜態塊-----父類靜態常量-------子類靜態塊----------子類靜態常量----------父類普通代碼塊------------父類構造方法------------子類代碼塊------------子類構造方法
類的加載順序
1、靜態代碼塊/靜態成員
靜態代碼塊/靜態成員最先加載。
靜態代碼塊/靜態成員順序按照代碼書寫先後順序加載。
如父類有靜態代碼塊/靜態成員,先調用父類靜態代碼塊/靜態成員(Object最優先),再一次加載本類的靜態代碼塊/靜態成員。
2、普通代碼塊/非靜態成員
同一類中普通代碼塊/非靜態成員順序在靜態代碼塊/靜態成員加載之後。
同一類中多段普通代碼塊/非靜態成員加載順序按照代碼書寫先後加載。
如父類有普通代碼塊/非靜態成員,現在加載父類的普通代碼塊/非靜態成員,在加載子類的普通代碼塊/非靜態成員。
3、構造方法
同一類中構造方法次於代碼塊之後加載。
同一類中如果有多個構造方法,按照實例時所調用的加載。
先加載父類的構造方法,在加載子類的構造方法。
子類的普通代碼塊/非靜態成員加載順序低於父類構造函數的加載順序。
4、靜態方法/普通方法
調用時才加載。
總結:
先加載父類的靜態代碼塊/靜態成員(父類中中都有或有多個有,按書寫順序) ------------- 加載子類的靜態代碼塊/靜態成員(字類中都有或有多個,按書寫順序)---------父類的普通代碼塊/非靜態成員(父類中中都有或有多個有,按書寫順序)------------父類的構造方法-----------------子類的普通代碼塊/非靜態成員(字類中都有或有多個,按書寫順序)-----------子類的構造方法