1. 程式人生 > >Java類的載入,以及靜態內部類的問題。

Java類的載入,以及靜態內部類的問題。

1、屬性的載入以及初始化的問題

當要例項化一個類時,JVM會首先載入該類,並且在載入過程中檢查這個類是否有靜態屬性以及靜態程式碼塊,如果有,就按順序分配記憶體並初始化他們,並且只在類載入的過程中初始化一次。

對於構造程式碼塊,以及普通屬性,是在類例項化時進行的,並且每次例項化都會呼叫,並且構造程式碼塊先於構造方法執行。

下面看這段程式碼:

首先JVM會載入這個類,通過斷點除錯發現當執行到靜態程式碼塊時,staticValue已經有值,這說明靜態屬性和靜態程式碼塊按順序執行;

這段程式碼的結果請看下圖:

如果把主方法的內容全部註釋掉,只留一個System.out.println("***********");可以發現結果為

通過以上結果可以很清晰的驗證屬性的載入順序。

2、static與final的區別

static屬性在載入時就已經分配記憶體,並且只分配一次,可以用於物件間共享屬性。

final定義的變數為常量,不能被改變,方法不能被覆蓋,類不能被繼承。

3、對於父類以及子類中的情況

會按照如下順序載入,1、父類中的靜態塊、靜態方法;2、子類中的靜態塊、靜態方法;3、父類的構造塊;4、父類的構造方法;5、子類的構造塊;6、子類的構造方法。

我們看如下程式碼:


對於在StaticIniBlockOrderTest類中例項化子類時,JVM首先會載入Parent類,並且同時給Parent類的靜態屬性分配記憶體和初始化、執行靜態程式碼塊;

其次,JVM會載入Child類,並對其進行與父類中相同的過程;

然後JVM會初始化父類,並按順序執行父類的構造程式碼塊與構造方法;

最後,JVM初始化子類,並執行構造程式碼塊,執行構造方法,完成例項化。

那麼輸出結果為: