在下麵這個例子中,我們分別在父類和子類中測試了 靜態代碼塊、普通代碼塊、靜態成員變數、普通成員變數、構造器、靜態內部類 。 一:代碼塊及變數測試 二:測試結果 三:測試靜態內部類 四:總結 經過我們反覆調整順序進行測試後,可得出如下結論: 1、靜態代碼塊、靜態成員變數只有第一次載入類時才會執行。 2 ...
在下麵這個例子中,我們分別在父類和子類中測試了靜態代碼塊、普通代碼塊、靜態成員變數、普通成員變數、構造器、靜態內部類。
一:代碼塊及變數測試
class Field{
public static String baseFieldInit(){
System.out.println("父類全局變數");
return "";
}
public static String baseStaticFieldInit(){
System.out.println("父類靜態變數");
return "";
}
public static String fieldInit(){
System.out.println("子類全局變數");
return "";
}
public static String staticFieldInit(){
System.out.println("子類靜態變數");
return "";
}
}
class Father{
static {
System.out.println("父類靜態代碼塊1");
}
private static String staticValue = Field.baseStaticFieldInit();
static {
System.out.println("父類靜態代碼塊2");
}
{
System.out.println("父類構造代碼塊1");
}
private String value = Field.baseFieldInit();
{
System.out.println("父類構造代碼塊2");
}
Father(){
System.out.println("父類構造器");
}
}
public class Children extends Father {
static {
System.out.println("子類靜態代碼塊1");
}
private static String staticValue = Field.staticFieldInit();
static {
System.out.println("子類靜態代碼塊2");
}
{
System.out.println("子類構造代碼塊1");
}
private String value = Field.fieldInit();
{
System.out.println("子類構造代碼塊2");
}
public Children(){
System.out.println("子類無參構造器");
}
private static class House{
private static Children houseColor = new Children();
}
/**
* 測試類
*/
public static void main(String[] args) {
Children children = new Children();
System.out.println("Children:"+children);
System.out.println("*******************************");
// 第二遍
Children children1 = new Children();
System.out.println("Children:"+children1);
System.out.println("*******************************");
}
}
二:測試結果
父類靜態代碼塊1
父類靜態變數
父類靜態代碼塊2
子類靜態代碼塊1
子類靜態變數
子類靜態代碼塊2
父類構造代碼塊1
父類全局變數
父類構造代碼塊2
父類構造器
子類構造代碼塊1
子類全局變數
子類構造代碼塊2
子類無參構造器
Children:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
父類構造代碼塊1
父類全局變數
父類構造代碼塊2
父類構造器
子類構造代碼塊1
子類全局變數
子類構造代碼塊2
子類無參構造器
Children:com.zhixie.jvmclassload.demo.Children@1be6f5c3
*******************************
三:測試靜態內部類
public static void main(String[] args) {
Children chouse = House.houseColor;
System.out.println("ChildrenHouse:"+chouse);
System.out.println("*******************************");
Children chouse1 = House.houseColor;
System.out.println("ChildrenHouse:"+chouse1);
System.out.println("*******************************");
}
父類靜態代碼塊1
父類靜態變數
父類靜態代碼塊2
子類靜態代碼塊1
子類靜態變數
子類靜態代碼塊2
父類構造代碼塊1
父類全局變數
父類構造代碼塊2
父類構造器
子類構造代碼塊1
子類全局變數
子類構造代碼塊2
子類無參構造器
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
四:總結
經過我們反覆調整順序進行測試後,可得出如下結論:
1、靜態代碼塊、靜態成員變數只有第一次載入類時才會執行。
2、執行順序為:父類靜態代碼塊及父類靜態成員變數(併列優先順序)--->子類靜態代碼塊及子類靜態成員變數(併列優先順序)--->父類普通代碼塊及父類成員變數--->父類構造器--->子類普通代碼塊及子類成員變數--->子類構造器。
3、靜態內部類,只有在第一次調用的時候才會被初始化。
下一章我們會用今天的代碼來學習一下類的載入順序。
如果文章對您有幫助,請記得點贊關註喲~
歡迎大家關註我的公眾號<情系IT>,每日技術推送文章供大家學習參考。