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)。