java類的載入以及初始化順序

2021-07-03 12:08:48 字數 1809 閱讀 2246

類的載入和初始化的了解對於我們對程式設計的理解有很大幫助,最近在看類的記載方面的問題。從網上查閱了若干文章,現總結如下:

我們通過一段**來了解類載入和初始化的順序:

package com.classloader.demo;

class insect

private int p=print(" insect.p initialized");

private static int x1 =print("static insect.x1 initialized");

static int print(string s)

}public class beetle extends insect

private static void dd()

private static  int x2 =

print("static beetle.x2 initialized");

public static void main(string args)

} 本程式的執行結果如下:

static insect.x1 initialized

static beetle.x2 initialized

beetle constructor

insect.p initialized

i = 9, j = 0

beetle.k initialized

k = 47

j = 39

首先當我們執行此程式的時候,主線程啟動,編譯器開始查詢beetle.class這個類,找到這個類後,開始載入這個類,在載入的過程發現有extends關鍵字,所以編譯器開始去載入insect.class這個類,(如果在載入這個類的時候如果發現這個類還有基類,那麼insect的直接基類就會被載入,如果還有基類,以此類推)此時因為insect沒有基類了,所以不需要再載入,此時(載入insect類時)insect類的靜態**將執行(靜態成員的初始化),所以此時列印出了  static insect.x1 initialized, 當insect的靜態**執行完後, beetle的靜態**開始執行 (初始化x2), 所以列印出:static beetle.x2 initialized;

到現在為止,所有基類以及靜態的初始化動作都已經執行完了,可以建立物件了。

這時候執行system.out.println("beetle constructor");所以列印出:beetle constructor;

下面開始執行beetle b = new beetle();此時首先為beetle分配記憶體空間,並且都初始化為0,注意boolean型別變數初始化為false;

在beetle內的**執行前,首先會呼叫基類的構造器,在基類(insect)的構造器內的**執行前,首先要執行基類的非靜態成員的初始化,此時p被初始化為47,並且列印出:insect.p initialized;當執行初始化後,基類的構造器裡的**system.out.println("i = " + i + ", j = " + j)開始執行,所以列印出:i = 9, j = 0;此時j被初始化為39;

當基類的構造器的**執行完後,首先要對beetle類的非靜態成員進行顯示的初始化,此時k被初始化為47,並且列印出:beetle.k initialized;等初始化完成後,beetle構造器裡的**開始執行,所以列印出:k=47;j=39,o(∩_∩)o...哈哈程式的結構分析完了。

值得注意的是:靜態成員初始化是從最頂層的類開始的,因為子類成員的初始化可能回用到基類的成員。

所以類載入以及初始化的順序是:類的靜態成員初始化分配記憶體(有父類的先父類,然後自己)->然後main方法執行->類初始化

特記於此!以備勿忘!

參考文獻:

java類的載入以及初始化順序

類的載入和初始化的了解對於我們對程式設計的理解有很大幫助,最近在看類的記載方面的問題。從網上查閱了若干文章,現總結如下 我們通過一段 來了解類載入和初始化的順序 package com.classloader.demo class insect private int p print insect....

java類的載入以及初始化順序

類的載入和初始化的了解對於我們對程式設計的理解有很大幫助,最近在看類的記載方面的問題。從網上查閱了若干文章,現總結如下 單獨乙個類的場景下,初始化順序為依次為 靜態資料,繼承的基類的建構函式,成員變數,被呼叫的建構函式。其中靜態資料只會初始化一次。public static void main st...

java類的載入以及初始化順序

類的載入和初始化的了解對於我們對程式設計的理解有很大幫助,最近在看類的記載方面的問題。從網上查閱了若干文章,現總結如下 我們通過一段 來了解類載入和初始化的順序 package com.classloader.demo class insect private int p print insect....