代碼如下:
class Parent {
// 靜態變量
public static String p_StaticField = "父類--靜態變量";
// 變量(其實這用對象更好能體同這一點,如專門寫一個類的實例)
//如果這個變量放在初始化塊的後面,是會報錯的,因為你根本沒有被初始化
public String p_Field = "父類--變量";
// 靜態初始化塊
static {
System.out.println(p_StaticField);
System.out.println("父類--靜態初始化塊");
}
// 初始化塊
{
System.out.println(p_Field);
System.out.println("父類--初始化塊");
}
// 構造器
public Parent() {
System.out.println("父類--構造器");
}
}
public class SubClass extends Parent {
// 靜態變量
public static String s_StaticField = "子類--靜態變量";
// 變量
public String s_Field = "子類--變量";
// 靜態初始化塊
static {
System.out.println(s_StaticField);
System.out.println("子類--靜態初始化塊");
}
// 初始化塊
{
System.out.println(s_Field);
System.out.println("子類--初始化塊");
}
// 構造器
public SubClass() {
//super();
System.out.println("子類--構造器");
}
// 程序入口
public static void main(String[] args) {
System.out.println("*************in main***************");
new SubClass();
System.out.println("*************second subClass***************");
new SubClass();
}
}
輸出結果
父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
*************in main***************
父類--變量
父類--初始化塊
父類--構造器
子類--變量
子類--初始化塊
子類--構造器
*************second subClass***************
父類--變量
父類--初始化塊
父類--構造器
子類--變量
子類--初始化塊
子類--構造器
結果分析:
很顯然在加載main方法後,靜態變量不管父類還是子類的都執行了,然後才是父類和子類的的普通變量和構造器。這是因為,當要創建子類這個對象時,發現這個類需要一個父類,所以把父類的.class加載進來,然後依次初始化其普通變量和初始化代碼塊,最後其構造器,然後可以開始子類的工作,把子類的.class加載進來,在做子類的工作。
另外在Java中子類中都會有默認的調用父類的默認構造函數即super(),當僅僅有默認構造函數裡
Java替你做了,我們可以做個實驗,如果在父類中注釋掉默認構造函數,加一個有參的構造函數時,如果
子類中不加super(argument),此時會報語法錯誤
如果我們把Main方法中的內容全注釋掉,你會發現只會輸出
父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
其它不會輸出了。原因呢? 還要研究