類的載入順序

2021-06-22 15:01:35 字數 1150 閱讀 7279

類載入的順序:

1.載入靜態成員/**塊:

先遞迴地載入父類的靜態成員/**塊(object的最先);再依次載入到本類的靜態成員。

同乙個類裡的靜態成員/**塊,按寫**的順序載入(靜態**塊和靜態成員誰在前面就先載入誰)。

如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫**的順序。

呼叫父類的靜態成員,可以像呼叫自己的一樣;但呼叫其子類的靜態成員,必須使用「子類名.成員名」來呼叫。

對於靜態成員,只有直接定義這個成員的類才會被初始化,如果實在父類superclass中定義的,那麼通過子類subclass來引用,只會出發superclass的初始化,並不會出發subclass的初始化。

2.

載入非靜態成員/**塊

:(例項塊在建立物件時才會被載入。而靜態成員在不建立物件時可以載入)

先遞迴地載入父類的非靜態成員/**塊(object的最先);再依次載入到本類的非靜態成員。

同乙個類裡的非靜態成員/**塊,按寫**的順序載入(**塊和成員誰在前面就先載入誰)

。同乙個類裡呼叫方法時,可以不理會寫**的順序。

但呼叫屬性時,必須注意載入順序。一般編譯不通過,如果能在載入前呼叫,值為預設初始值(如:null 或者 0)。

呼叫父類的非靜態成員(private 除外),也可以像呼叫自己的一樣。

3.呼叫構造方法:

先遞迴地呼叫父類的構造方法(object的最先);預設呼叫父類空參的,也可在第一行寫明呼叫父類某個帶參的。

再依次到本類的構造方法;構造方法內,也可在第一行寫明呼叫某個本類其它的構造方法。

注意:如果載入時遇到 override 的成員,可看作是所需建立的型別賦值給當前型別。

其呼叫按多型用法:只有非靜態方法有多型;而靜態方法、靜態屬性、非靜態屬性都沒有多型。

假設子類override父類的所有成員,包括靜態成員、非靜態屬性和非靜態方法。

由於構造子類時會先構造父類;而構造父類時,其所用的靜態成員和非靜態屬性是父類的,但非靜態方法卻是子類的;

由於構造父類時,子類並未載入;如果此時所呼叫的非靜態方法裡有成員,則這個成員是子類的,且非靜態屬性是預設初始值的。

類的載入順序

直接上 熱乎的 package test 有父類的情況 1.載入父類 1.1 為靜態屬性分配儲存空間並賦初始值 1.2 執行靜態初始化塊和靜態初始化語句 從上至下 2.載入子類 2.1 為靜態屬性分配儲存空間 2.2 執行靜態初始化塊和靜態初始化語句 從上至下 3.載入父類構造器 3.1 為例項屬性...

類的載入順序

初始化過程 1.初始化父類中的靜態成員變數和靜態 塊 2.初始化子類中的靜態成員變數和靜態 塊 3.初始化父類的普通成員變數和 塊,再執行父類的構造方法 4.初始化子類的普通成員變數和 塊,再執行子類的構造方法 class x class y public class zextends x publ...

類的載入順序

public class base public void callname static class sub extends base public static void main string args 執行base b new sub 時由於多型 b編譯時表現為base類特性,執行時表現為s...