1. 程式人生 > >類建立時,變數及構造器初始化順序

類建立時,變數及構造器初始化順序

自己寫了一個小的例子,來說明在類建立的過程中,父類與子類靜態變數、普通成員變數、構造器的初始化順序。

package com.liuxmThinkInJava.initialize;

/**
 * 父類
 * @author Administrator
 *
 */
public class SuperClass {
	private static InitializeDesc superVarial = new InitializeDesc("父類靜態變數被初始化");
	
	static{
		InitializeDesc superVarial = new InitializeDesc("父類靜態塊中的變數被初始化");
	}

	private InitializeDesc i3 = new InitializeDesc("父類普通成員變數1被初始化");
	private InitializeDesc i4 = new InitializeDesc("父類普通成員變數2被初始化");
	
	public SuperClass(){
		System.out.println("父類構造器被呼叫");
	}
	
	public static void fun(){
		System.out.println("父類靜態方法被呼叫");
	}
}

package com.liuxmThinkInJava.initialize;

/**
 * 子類
 * @author Administrator
 *
 */
public class SubClass extends SuperClass{
	private static InitializeDesc i = new InitializeDesc("子類靜態變數被初始化");
	static{
	  InitializeDesc i2 = new InitializeDesc("子類靜態塊中的變數被初始化");
	}
	
	private InitializeDesc i3 = new InitializeDesc("子類普通成員變數1被初始化");
	private InitializeDesc i4 = new InitializeDesc("子類普通成員變數2被初始化");
	
	public SubClass(){
		System.out.println("子類構造器被呼叫");
	}
	
	public static void main(String[] args) {
		//System.out.println("在子類中呼叫main方法");
		//System.out.println("建立子類物件開始》》》》》》》》》》");
		new SubClass();
		//System.out.println("建立子類物件結束《《《《《《《《《《");
	}
}

/**
 * 輔助描述類
 * @author Administrator
 *
 */
public class InitializeDesc {
	public InitializeDesc(String desc){
		System.out.println(desc);
	}
}

在子類中執行main方法,輸出結果中可以清晰的看到初始化的順序:

父類靜態變數被初始化
父類靜態塊中的變數被初始化
子類靜態變數被初始化
子類靜態塊中的變數被初始化
父類普通成員變數1被初始化
父類普通成員變數2被初始化
父類構造器被呼叫
子類普通成員變數1被初始化
子類普通成員變數2被初始化
子類構造器被呼叫

比較重要的幾點:

1、在類的內部,變數的定義順序,決定了變數的初始化順序,即使這些變數分散在方法之間。

2、靜態變數只有在第一次建立物件或者第一次呼叫靜態資料時才被初始化。

3、初始化的順序是先靜態物件,而後是非靜態物件。

4、區域性變數初始化:變數必須被初始化,否者提示編譯錯誤。

5、成員變數初始化:變數不被初始化,會有預設值出現。

6、自動初始化將在構造器初始化之前執行。