關於類中靜態變數和靜態方法以及構造方法之類的載入順序問題現在成了面試中的基本問題,今天閒來無事,就寫一篇部落格來記述一下。
package com.cn.bb;
public class testparentstatic
private static string staticfield = "父類靜態變數";
private string field = "父類普通變數";
public testparentstatic()
public void print()
static
public static void main(string args)
}
輸出結果如下:
父類靜態**塊first
父類靜態變數
父類靜態**塊second
父類構造**塊
父類構造方法
父類普通變數
由於靜態變數和靜態**塊處於同一優先順序,所以載入順序和他們的自身順序有關。
由此可以看出載入順序為:靜態變數(靜態**塊)> 構造**塊 > 構造方法 > 普通變數(普通方法)
package com.cn.bb;
public class testchildstatic extends testparentstatic
private static string staticfield = "子類靜態變數";
private string field = "子類普通變數";
public testchildstatic()
public void print()
static
public static void main(string args)
}
輸出的執行結果:
父類靜態**塊first
父類靜態變數
父類靜態**塊second
子類靜態**塊first
子類靜態變數
子類靜態**塊second
父類構造**塊
父類構造方法
子類構造**塊
子類構造方法
子類普通變數
由上可以看出載入順序為:
父類的靜態變數(父類的靜態**塊)> 子類的靜態變數(子類的靜態**塊)> 父類的構造**塊 > 父類的構造方法 > 子類的構造**塊 > 子類的構造方法 > 子類的普通變數
package com.cn.bb;
public class testchildstatic extends testparentstatic
private static string staticfield = "子類靜態變數";
private string field = "子類普通變數";
public testchildstatic()
public void print()
static
public static void main(string args)
}
輸出的執行結果:
父類靜態**塊first
父類靜態變數
父類靜態**塊second
子類靜態**塊first
子類靜態變數
子類靜態**塊second
父類構造**塊
父類構造方法
子類構造**塊
子類構造方法
父類構造**塊
父類構造方法
子類構造**塊
子類構造方法
對比2和3的情況可以看出,靜態變數和靜態**塊只會初始化一次,而構造**塊和構造方法卻和物件的建立有關,建立幾次,就會載入幾次。
類的載入順序
直接上 熱乎的 package test 有父類的情況 1.載入父類 1.1 為靜態屬性分配儲存空間並賦初始值 1.2 執行靜態初始化塊和靜態初始化語句 從上至下 2.載入子類 2.1 為靜態屬性分配儲存空間 2.2 執行靜態初始化塊和靜態初始化語句 從上至下 3.載入父類構造器 3.1 為例項屬性...
類的載入順序
類載入的順序 1.載入靜態成員 塊 先遞迴地載入父類的靜態成員 塊 object的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入 靜態 塊和靜態成員誰在前面就先載入誰 如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的...
類的載入順序
初始化過程 1.初始化父類中的靜態成員變數和靜態 塊 2.初始化子類中的靜態成員變數和靜態 塊 3.初始化父類的普通成員變數和 塊,再執行父類的構造方法 4.初始化子類的普通成員變數和 塊,再執行子類的構造方法 class x class y public class zextends x publ...