Java類及對象的初始化順序

1.初始化規則:

下面規則優先級從前往後依次降低

①.加載一個類時先加載初始化基類後加載初始化擴展類;

②.類的初始化高於實例的初始化:

類的初始化依靠(靜態代碼塊static{....})以及(靜態變量)這些用於初始化類的代碼只會被加載執行一次;

對象的初始化依靠實例成員變量、實例代碼塊{...}、構造方法,這些在對象每次被創建時都要執行一次;

③.變量聲明執行優先級高於代碼塊執行,代碼塊高於構造函數;

④.聲明順序和執行順序一致;

2.測試性代碼

public class DemoTest {
	public static void main(String[] args) throws ClassNotFoundException {
		DemoBase obj1 = new DemoBaseExtends();
		DemoBase obj2 =  new DemoBaseExtends();
		obj1.toString();
		obj2.toString();
	}
	
}
class DemoBase{
	
	static{
		System.out.println("DemoBase static called1");
		i = 1;
	}
	{
		System.out.println("DemoBase object called1");
	}
	public DemoBase() {
		System.out.println("DemoBase constu called");
	}
	{
		System.out.println("DemoBase object called2");
	}
	static{
		System.out.println("DemoBase static called2");
		i = 1;
	}
	
	static final String str = "qwer";
	static int i;
}
class DemoBaseExtends extends DemoBase{
	String name = null;
	static{
		System.out.println("DemoBaseExtends static called1");
	}
	{
		System.out.println("DemoBaseExtends Object called1");
		name = "DemoBaseExtends";
	}
	public DemoBaseExtends() {
		super();
		System.out.println("DemoBaseExtends constu called");
	}
	{
		System.out.println("DemoBaseExtends Object called2");
	}
	static{
		System.out.println("DemoBaseExtends static called2");
	}
}
輸出順序如下:
DemoBase static called1
DemoBase static called2
DemoBaseExtends static called1
DemoBaseExtends static called2
DemoBase object called1
DemoBase object called2
DemoBase constu called
DemoBaseExtends Object called1
DemoBaseExtends Object called2
DemoBaseExtends constu called
DemoBase object called1
DemoBase object called2
DemoBase constu called
DemoBaseExtends Object called1
DemoBaseExtends Object called2
DemoBaseExtends constu called

##3.彙總

基類靜態變量(按聲明順序)=》

基類靜態代碼塊(按聲明順序)=》

擴展類靜態變量(按聲明順序)=》

擴展類靜態代碼塊(按聲明順序)=》

基類實例變量(按聲明順序)=》

基類實例代碼塊(按聲明順序)=》

基類構造函數(按調用順序)=》

擴展類實例變量(按聲明順序)=》

擴展類實例代碼塊(按聲明順序)=》

擴展類構造函數(按調用順序)

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