Java基礎——java程序初始化順序、構造函數

1. Java初始化順序

當實例化對象時,對象所在類的所有成員變量首先要進行初始化,只有當所有類成員完成初始化後,纔會調用對象所在類的構造函數創建對象。

3個原則:

(1)靜態對象(變量)優先於非靜態對象(變量)初始化。其中,靜態對象(變量) 只初始化一次,而非靜態對象(變量)可能會初始化多次。

(2)父類優先於子類進行初始化。

(3)按照成員變量的定義順序進行初始化。

即便變量定義散佈於方法定義之中,她們依然在任何方法(包括構造函數)被調用之前先初始化。

java初始化工作可以在許多不同的代碼塊中完成(如靜態代碼塊、構造函數等),他們的執行順序如下:

父類靜態變量、父類靜態代碼塊、子類靜態變量、子類靜態代碼塊、父類非靜態變量、父類非靜態代碼塊、父類構造函數、子類非靜態變量、子類非靜態代碼塊、子類構造函數。

示例:

class B extends Object{
	static            //父類靜態代碼塊
	{
		System.out.println("Load B1");
	}
	public B()        //父類構造函數
	{
		System.out.println("Create B");
	}
	static            //父類靜態代碼塊
	{
		System.out.println("Load B2");
	}
}

class A extends B{
	static            //子類靜態代碼塊
	{
		System.out.println("Load A");
	}
	public A()         //子類構造函數
	{
		System.out.println("Create A");
	}
}

public class Testclass{ 
	public static void main(String[] args)
	{
		new A();
	}
}

 輸出結果:

Load B1

Load B2

Load A

Create B

Create A

2. 構造函數

定義:構造函數是一種特殊的函數,用來在對象實例化時初始化對象的成員變量

特點:(1) 構造函數必須與類的名字相同,並且不能有返回值(返回值也不能爲void)

(2)每個類可以有多個構造函數。當開發人員沒有提供構造函數時,編譯器在把源代碼編譯成字節碼的過程中會提供一個沒有參數默認的構造函數,但該構造函數不會執行任何代碼。

(3)構造函數可以有0個、1個或1個以上的參數。

(4)構造函數在對象實例化時被自動調用,且只運行一次;而普通方法是在程序執行到它時被調用,且可以被該對象調用多次

(5)構造函數不能被繼承,因此,它不能被覆蓋,但是構造函數能夠被重載。

(6)當父類沒有提供無參數的構造函數時,子類的構造函數中必須顯示地調用父類的構造函數(通過super關鍵字)。

         如果父類提供了無參數的構造函數,編譯器默認調用父類提供的無參數的構造函數。

         當有父類時,在實例化對象時會先執行父類的構造函數,然後執行子類的構造函數。(見上文初始化順序)

(7)當父類和子類都沒有定義構造函數時,編譯器會爲父類生成一個默認的無參數的構造函數,給子類也生成一個默認的無參數的構造函數。默認構造器的修飾符只跟當前類的修飾符有關(如,一個類被定義爲public,那麼它的默認構造器也爲public)。 

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