Java Java中類的初始化順序

2021-06-26 23:54:28 字數 2752 閱讀 1733

一、乙個類的初始化順序(沒繼承情況)

規則:1.靜態變數》普通變數》構造方法

2.變數定義的順序決定初始化的順序

3.靜態變數和靜態塊是一樣的,普通變數和非靜態塊是一樣的,即可以把靜態塊看作是靜態變數,把非靜態塊看作是普通變數

public class test1 

}class c

}class d

/* d的非靜態變數 */

private c c1 = new c("變數1");

private c c2 = new c("變數2");

/* d的靜態變數 */

private static c c3 = new c("靜態變數1");

private static c c4 = new c("靜態變數2");

/* d的靜態初始化塊 */

static

/* d的例項初始化塊 */

}

執行結果:

靜態變數1

靜態變數2

d的靜態初始化塊。。

變數1變數2

d的例項初始化塊。。

d的構造方法

二、乙個類的初始化順序(有繼承情況)

規則:1.父類的初始化》子類的初始化

2.靜態變數》普通變數》構造方法

3.變數定義的順序決定初始化的順序

4.靜態變數和靜態塊是一樣的,普通變數和非靜態塊是一樣的,即可以把靜態塊看作是靜態變數,把非靜態塊看作是普通變數

public class test2 

}class feild

}class a

/* a的非靜態變數 */

private feild f1 = new feild("父類變數1");

private feild f2 = new feild("父類變數2");

/* a的靜態變數 */

private static feild f3 = new feild("父類靜態變數1");

private static feild f4 = new feild("父類靜態變數2");

/* a的靜態初始化塊 */

static

/* a的例項初始化塊 */ }

class b extends a

/* b的非靜態變數 */

private feild f5 = new feild("子類變數1");

private feild f6 = new feild("子類變數2");

/* b的靜態變數 */

private static feild f7 = new feild("子類靜態變數1");

private static feild f8 = new feild("子類靜態變數2");

/* b的靜態初始化塊 */

static

/* b的例項初始化塊 */

}

執行結果:

父類靜態變數1

父類靜態變數2

父類的靜態初始化塊。。

子類靜態變數1

子類靜態變數2

子類的靜態初始化塊。。

父類變數1

父類變數2

父類的例項初始化塊。。

父類的構造方法

子類變數1

子類變數2

子類的例項初始化塊。。

子類的構造方法

下面再看乙個例子:

public class test1   

}

class d

public d(string s)

/* d的非靜態變數 */

private static d d1 = new d("變數1");

private static d d2 = new d("變數2");

/* d的靜態初始化塊 */

static

/* d的例項初始化塊 */

}

輸出結果為:

d的例項初始化塊。。

變數1d的例項初始化塊。。

變數2d的靜態初始化塊。。

d的例項初始化塊。。

d的構造方法

解析:因為new d()時,類d裡面會建立兩個例項,而又因為靜態塊的位置在兩個例項建立的後面,所以不會先輸出靜態塊的內容,而是建立了兩個例項d1、d2後,再new d(),這時才執行靜態塊、例項塊、構造方法。

下面將靜態塊移到d1和d2建立之前:

public class test1   

}

class d

public d(string s)

/* d的靜態初始化塊 */

static

/* d的非靜態變數 */

private static d d1 = new d("變數1");

private static d d2 = new d("變數2");

/* d的例項初始化塊 */

}

輸出結果如下:

d的靜態初始化塊。。

d的例項初始化塊。。

變數1d的例項初始化塊。。

變數2d的例項初始化塊。。

d的構造方法

構造方法 類的初始化塊以及類字段的初始化順序

首先,以下 為何無法通過編譯?哪兒出錯了?public class test class foo 如果類提供了乙個自定義的構造方法,將導致系統不再提供預設構造方法。如果乙個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?class initializeblockclass pub...

類中變數初始化

類中的變數 包括基本資料型別,物件引用 在載入物件位元組碼進記憶體,在使用其之前,呼叫構造方法之前就已經完成初始化賦值了。其中static 修飾的變數在載入物件位元組碼時時就賦值了,其他變數在這以後被賦值,也就是static 修飾的先賦值。驗證 如下 package cn.ytu.en class ...

類的初始化

類的初始化通產有3種型別 使用初始化列表,在建構函式體中賦值,以及使用預設建構函式。先說前兩種 初始化列表與在建構函式體中賦值的區別在 呢?主要有兩點 第一,有的成員不能使用函式體中的 初始化。這其實就是初始化與賦值的區別 比如比如const 成員,引用型別,以及沒有定義預設建構函式的類,它們都必須...