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 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、靜態方法/普通方法

        調用時才加載。

總結:

   先加載父類的靜態代碼塊/靜態成員(父類中中都有或有多個有,按書寫順序) -------------  加載子類的靜態代碼塊/靜態成員(字類中都有或有多個,按書寫順序)---------父類的普通代碼塊/非靜態成員(父類中中都有或有多個有,按書寫順序)------------父類的構造方法-----------------子類的普通代碼塊/非靜態成員(字類中都有或有多個,按書寫順序)-----------子類的構造方法

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章