一、乙個類的初始化順序(沒繼承情況)
規則: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 成員,引用型別,以及沒有定義預設建構函式的類,它們都必須...