淺談Java中父類與子類的加載次序詳解。本站提示廣大學習愛好者:(淺談Java中父類與子類的加載次序詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談Java中父類與子類的加載次序詳解正文
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辦法中的內容全正文失落,你會發明只會輸入
父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
其它不會輸入了。緣由呢? 還要研討