變數初始化順序及類的載入順序

2021-08-18 17:00:22 字數 1669 閱讀 4164

綜合:先載入類(靜態欄位及靜態**塊)->(若有則執行主函式main)->預設初始化域-》執行構造方法(隱式初始化域和**塊,再執行構造器的主體)-

>呼叫方法

4 執行子類的建構函式,建構函式來執行初始化。其中子類的建構函式

第一件事是呼叫基類的建構函式。(

第二件事是

隱式初始化域和**塊

。接著才是執行構造器的主體。

**:子類的構造器中第一件事就是呼叫基類構造器。

class classone 

int t;

classone(int i)

}class classtwo extends classone

int m;

classtwo(int i)

}public class classthree extends classtwo

public classthree(int i)

public static void main(string args)

結果:
classone靜態塊

classtwo靜態塊

classthree靜態塊

--------建立classtwo物件

t自動初始化完畢,結果為:0

classone非靜態塊

classone構造器 及t的值 1 i=2

m自動初始化完畢,結果為:0

classtwo非靜態塊

classtwo構造器 及m 5

import static net.mindview.util.print.*;

class glyph

glyph()

}class roundglyph extends glyph

roundglyph(int r)

void draw()

}public class polyconstructors

}

結果:

靜態**塊  t=:1

glyph() before draw()

預設初始化 radius = 0

glyph() after draw()

非靜態**塊

初始化radius=:1

賦值radius = 5

到此為止,單一類初始化順序為:

1:載入類(static 域和static**塊)

2:執行main方法(static方法)

3:預設初始化域(**塊沒有預設初始化)為0或其他null之類

4:執行建構函式(先隱式初始化域和**塊,再執行構造器主體)

繼承類初始化順序:

1:先載入類的成員(先基類再子類)(靜態域和靜態塊)

2 :再執行main方法(static方法)

3:預設初始化域

4:建立子類的物件時,呼叫子類建構函式,(遞迴呼叫基類建構函式,當基類建構函式

執行完畢

之後),隱式初始化域和**塊,再執行子類建構函式剩下的部分。

可知順序:

1:先載入類的成員(先基類再子類)(靜態域和靜態塊)

2 :再執行main方法

3:建立子類的物件時,呼叫子類建構函式,(遞迴呼叫基類建構函式,當基類建構函式執行完畢之後),執行子類建構函式剩下的部分。

類的載入和初始化順序

靜態變數,靜態塊 按文字順序載入 非靜態變數,非靜態塊 按文字順序載入 構造器 靜態 塊不能在 靜態 變數宣告之前應用它。對於繼承關係中的類的初始化 父類靜態變數,父類靜態塊 子類靜態變數,子類靜態塊 父類非靜態變數,父類非靜態塊 父類構造器 子類非靜態變數,子類非靜態塊 子類構造器 如果在靜態塊中...

變數初始化順序

1 變數定義的先後順序決定初始化順序,即使變數定義散布在方法定義之間,他們仍舊會在方法被呼叫之前得到初始化,構造方法也是特殊的方法 2 執行順序 靜態塊,靜態變數,非靜態變數,構造方法 每次在建立物件的時候非靜態變數都會被初始化 靜態物件只會在類載入的時候被初始化一次 public class in...

類初始化順序

類初始化時,jvm會先初始化所有 1,靜態屬性,靜態例項,靜態塊。2.新建例項 靜態或非靜態 時會先執行所有非靜態屬性和構造塊 非靜態屬性和構造塊執行級別相同,誰前誰先 然後構造方法。注意 1 靜態 塊不能存在於任何方法體內。2 靜態 塊不能直接訪問靜態例項變數和例項方法,需要通過類的例項物件來訪問...