欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JAVA類加載機制(推薦)

 更新時間:2016年09月17日 11:33:43   作者:冬瓜蔡  
這篇文章主要介紹了JAVA類加載機制的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

JAVA源碼編譯由三個過程組成:

1、源碼編譯機制。

2、類加載機制

3、類執(zhí)行機制

我們這里主要介紹編譯和類加載這兩種機制。

一、源碼編譯

代碼編譯由JAVA源碼編譯器來完成。主要是將源碼編譯成字節(jié)碼文件(class文件)。字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。

二、類加載

類的生命周期是從被加載到虛擬機內存中開始,到卸載出內存結束。過程共有七個階段,其中到初始化之前的都是屬于類加載的部分

加載----驗證----準備----解析-----初始化----使用-----卸載

系統(tǒng)可能在第一次使用某個類時加載該類,也可能采用預加載機制來加載某個類,當運行某個java程序時,會啟動一個java虛擬機進程,兩次運行的java程序處于兩個不同的JVM進程中,兩個jvm之間并不會共享數(shù)據(jù)。

1、加載階段

這個流程中的加載是類加載機制中的一個階段,這兩個概念不要混淆,這個階段需要完成的事情有:

1)通過一個類的全限定名來獲取定義此類的二進制字節(jié)流。

2)將這個字節(jié)流所代表的靜態(tài)存儲結構轉化為方法區(qū)的運行時數(shù)據(jù)結構。

3)在java堆中生成一個代表這個類的Class對象,作為訪問方法區(qū)中這些數(shù)據(jù)的入口。

由于第一點沒有指明從哪里獲取以及怎樣獲取類的二進制字節(jié)流,所以這一塊區(qū)域留給我開發(fā)者很大的發(fā)揮空間。這個我在后面的類加載器中在進行介紹。

2、準備階段

這個階段正式為類變量(被static修飾的變量)分配內存并設置類變量初始值,這個內存分配是發(fā)生在方法區(qū)中。

1、注意這里并沒有對實例變量進行內存分配,實例變量將會在對象實例化時隨著對象一起分配在JAVA堆中。

2、這里設置的初始值,通常是指數(shù)據(jù)類型的零值。

private static int a = 3;
 這個類變量a在準備階段后的值是0,將3賦值給變量a是發(fā)生在初始化階段。

3、初始化階段

初始化是類加載機制的最后一步,這個時候才正真開始執(zhí)行類中定義的JAVA程序代碼。在前面準備階段,類變量已經(jīng)賦過一次系統(tǒng)要求的初始值,在初始化階段最重要的事情就是對類變量進行初始化,關注的重點是父子類之間各類資源初始化的順序。

java類中對類變量指定初始值有兩種方式:1、聲明類變量時指定初始值;2、使用靜態(tài)初始化塊為類變量指定初始值。

初始化的時機

1)創(chuàng)建類實例的時候,分別有:1、使用new關鍵字創(chuàng)建實例;2、通過反射創(chuàng)建實例;3、通過反序列化方式創(chuàng)建實例。

new Test();
Class.forName(“com.mengdd.Test”);

2)調用某個類的類方法(靜態(tài)方法)

Test.doSomething();

3)訪問某個類或接口的類變量,或為該類變量賦值。 

int b=Test.a;
Test.a=b;

4)初始化某個類的子類。當初始化子類的時候,該子類的所有父類都會被初始化。

5)直接使用java.exe命令來運行某個主類。

除了上面幾種方式會自動初始化一個類,其他訪問類的方式都稱不會觸發(fā)類的初始化,稱為被動引用。

1、子類引用父類的靜態(tài)變量,不會導致子類初始化。

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println("supclass init");
 }
}
public class SubClass extends SupClass
{
 static
 {
  System.out.println("subclass init");
 }
}
public class Test
{
 public static void main(String[] args)
 {
  System.out.println(SubClass.a);
 }
}

執(zhí)行結果:

supclass init
123

2、通過數(shù)組定義引用類,不會觸發(fā)此類的初始化

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println("supclass init");
 }
}
public class Test
{
 public static void main(String[] args)
 {
  SupClass[] spc = new SupClass[10];
 }
}

執(zhí)行結果:

3、引用常量時,不會觸發(fā)該類的初始化

public class ConstClass
{
 public static final String A= "MIGU";
 static
 {
  System.out.println("ConstCLass init");
 }
}
public class TestMain
{
 public static void main(String[] args)
 {
  System.out.println(ConstClass.A);
 }
}

執(zhí)行結果:

MIGU

用final修飾某個類變量時,它的值在編譯時就已經(jīng)確定好放入常量池了,所以在訪問該類變量時,等于直接從常量池中獲取,并沒有初始化該類。

初始化的步驟

1、如果該類還沒有加載和連接,則程序先加載該類并連接。

2、如果該類的直接父類沒有加載,則先初始化其直接父類。

3、如果類中有初始化語句,則系統(tǒng)依次執(zhí)行這些初始化語句。

在第二個步驟中,如果直接父類又有直接父類,則系統(tǒng)會再次重復這三個步驟來初始化這個父類,依次類推,JVM最先初始化的總是java.lang.Object類。當程序主動使用任何一個類時,系統(tǒng)會保證該類以及所有的父類都會被初始化。

以上所述是小編給大家介紹的JAVA類加載機制(推薦),希望對大家有所幫助!

相關文章

  • Spring整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案

    Spring整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案

    這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    這篇文章主要介紹了java數(shù)字和中文算數(shù)驗證碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 導入SpringCloud依賴踩的坑及解決

    導入SpringCloud依賴踩的坑及解決

    這篇文章主要介紹了導入SpringCloud依賴踩的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java微信公眾平臺之消息管理

    Java微信公眾平臺之消息管理

    這篇文章主要為大家詳細介紹了Java微信公眾平臺之消息管理的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳細講解Java的泛型

    詳細講解Java的泛型

    這篇文章主要介紹了Java的泛型,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • Java基礎之反射詳解

    Java基礎之反射詳解

    這篇文章主要介紹了教你怎么通過IDEA設置堆內存空間,文中有非常詳細的代碼示例,對正在使用IDEA的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • Hibernate映射解析之關聯(lián)映射詳解

    Hibernate映射解析之關聯(lián)映射詳解

    所謂關聯(lián)映射就是將關聯(lián)關系映射到數(shù)據(jù)庫里,在對象模型中就是一個或多個引用。下面這篇文章詳細的給大家介紹了Hibernate映射解析之關聯(lián)映射的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Java基礎之如何學好Java

    Java基礎之如何學好Java

    這篇文章已經(jīng)是有數(shù)年“網(wǎng)齡”的老文,不過在今天看來仍然經(jīng)典。如何學習java?本篇文章可以說也是面對編程初學者的一篇指導文章,其中對于如何學習Java的步驟的介紹,很多也適用于開發(fā)領域其他技能的學習。
    2014-10-10
  • nacos在liunx系統(tǒng)中啟動成功瀏覽器卻訪問不了的解決方法

    nacos在liunx系統(tǒng)中啟動成功瀏覽器卻訪問不了的解決方法

    在linux下搭建nacos,現(xiàn)在想要啟動,訪問nacos頁面,訪問不了,所以本文小編將給大家介紹nacos在liunx系統(tǒng)中啟動成功,瀏覽器卻訪問不了?全面的解決辦法,需要的朋友可以參考下
    2023-09-09
  • hotspot解析jdk1.8?Unsafe類park和unpark方法使用

    hotspot解析jdk1.8?Unsafe類park和unpark方法使用

    這篇文章主要為大家介紹了hotspot解析jdk1.8?Unsafe類park和unpark方法使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論