Java類加載的初始化階段

Java字節代碼的表現形式是字節數組(byte[]),而Java類在JVM中的表現形式是java.lang.Class類的對象。一個Java類從字節代碼到能夠在JVM中被使用,需要經過加載、鏈接和初始化這三個步驟。這三個步驟中,對開發人員直接可見的是Java類的加載,通過使用Java類加載器(class loader)可以在運行時刻動態的加載一個Java類;而鏈接和初始化則是在使用Java類之前會發生的動作。本文會詳細介紹Java類的加載、鏈接和初始化的過程。

Java類加載的初始化階段

類加載的初始化階段對類變量賦予正確的值。主要有兩種初始化方式,一種是通過類變量初始化語句;一種是靜態初始化語句。如下述代碼所示,前者是類變量初始化語句,後者是靜態初始化語句。

public class Example1 {

static int width;

static int height = (int) (Math.random() * 2.0);

static {

width = (int) (3 * Math.random() * 5.0);

}

}

所有的類變量初始化語句和靜態初始化語句都被Java編譯器收集在一起,放在一個特殊方法裡。對於類而言,該方法稱為類初始化方法,對於接口而言,該方法稱為接口初始化方法。在Java class文件裡,類和接口的初始化方法統一被稱作為() 方法。並且這種方法只能被Java虛擬機調用,Java程序是無法調用的。

Java類加載的初始化階段

Java類的初始化

當一個Java類第一次被真正使用到的時候,JVM會進行該類的初始化操作。初始化過程的主要操作是執行靜態代碼塊和初始化靜態域。在一個類被初始化之前,它的直接父類也需要被初始化。但是,一個接口的初始化,不會引起其父接口的初始化。在初始化的時候,會按照源代碼中從上到下的順序依次執行靜態代碼塊和初始化靜態域。

public class StaticTest {

public static int X = 10;

public static void main(String[] args) {

System.out.println(Y); //輸出60

}

static {

X = 30;

}

public static int Y = X * 2;

}

在上面的代碼中,在初始化的時候,靜態域的初始化和靜態代碼塊的執行會從上到下依次執行。因此變量X的值首先初始化成10,後來又被賦值成30;而變量Y的值則被初始化成60。

Java類加載的初始化階段

類加載以及初始化的順序是:類的靜態成員初始化分配內存(有父類的先父類,然後自己)->然後main方法執行->類初始化{類非靜態成員的初始化,然後執行構造器(有父類的先給父類的非靜態成員初始化,然後父類的構造器)}

尚學堂立志解決中國教育不公平和低效率問題,幫助千千萬萬被傳統教育方式耽誤的人,傳授實用、前沿的知識,成就學員個人理想,為愛你的人和你愛的人創造美好的生活。尚學堂12大精英團隊+各類實戰項目,真正實現1+1>10的目標效果。幫助學員迅速成長,持久騰飛,成就學員“高富帥”人生。


分享到:


相關文章: