最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

JAVA源碼編譯由三個(gè)過程組成:

1、源碼編譯機(jī)制。

2、類加載機(jī)制

3、類執(zhí)行機(jī)制

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

一、源碼編譯

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

二、類加載

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

加載----驗(yàn)證----準(zhǔn)備----解析-----初始化----使用-----卸載

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

1、加載階段

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

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

2)將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。

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

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

2、準(zhǔn)備階段

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

1、注意這里并沒有對(duì)實(shí)例變量進(jìn)行內(nèi)存分配,實(shí)例變量將會(huì)在對(duì)象實(shí)例化時(shí)隨著對(duì)象一起分配在JAVA堆中。

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

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

3、初始化階段

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

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

初始化的時(shí)機(jī)

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

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

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

Test.doSomething();

3)訪問某個(gè)類或接口的類變量,或?yàn)樵擃愖兞抠x值。 

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

4)初始化某個(gè)類的子類。當(dāng)初始化子類的時(shí)候,該子類的所有父類都會(huì)被初始化。

5)直接使用java.exe命令來運(yùn)行某個(gè)主類。

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

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

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í)行結(jié)果:

supclass init
123

2、通過數(shù)組定義引用類,不會(huì)觸發(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í)行結(jié)果:

3、引用常量時(shí),不會(huì)觸發(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í)行結(jié)果:

MIGU

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

初始化的步驟

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

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

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

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

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

相關(guān)文章

  • Mybatis返回值(resultType&resultMap)的具體使用

    Mybatis返回值(resultType&resultMap)的具體使用

    返回值屬性有兩種設(shè)置,一種是resultType,一種是resultMap,本文主要介紹了Mybatis返回值(resultType&resultMap)的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • java中處理socket通信過程中粘包的情況

    java中處理socket通信過程中粘包的情況

    本篇文章主要介紹了java中處理socket通信過程中粘包的情況,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • SpringBoot啟動(dòng)security后如何關(guān)閉彈出的/login頁面

    SpringBoot啟動(dòng)security后如何關(guān)閉彈出的/login頁面

    這篇文章主要介紹了SpringBoot啟動(dòng)security后如何關(guān)閉彈出的login頁面問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 我從jdk1.8升級(jí)到j(luò)dk11所遇到的坑都有這些

    我從jdk1.8升級(jí)到j(luò)dk11所遇到的坑都有這些

    這篇文章主要介紹了從jdk1.8升級(jí)到j(luò)dk11將會(huì)遇到的一些坑,本文給大家分享解決方案對(duì)大家的學(xué)習(xí)或工作具有參考借鑒價(jià)值,對(duì)jdk1.8升級(jí)到j(luò)dk11相關(guān)知識(shí)感興趣的朋友,快來看看吧
    2021-08-08
  • SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式

    SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式

    這篇文章主要介紹了SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)超詳細(xì)教程

    Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)超詳細(xì)教程

    這篇文章主要介紹了一個(gè)簡單的Java學(xué)生信息管理系統(tǒng),使用ArrayList集合存儲(chǔ)學(xué)生對(duì)象信息,并實(shí)現(xiàn)了添加、刪除、修改和查看學(xué)生信息的功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Java截取字符串的幾種常用方法

    Java截取字符串的幾種常用方法

    這篇文章主要給大家介紹了關(guān)于Java截取字符串的幾種常用方法,在Java編程語言中,String類提供了用于操作字符串的豐富方法,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • SpringBoot Controller中的常用注解

    SpringBoot Controller中的常用注解

    這篇文章主要介紹了SpringBoot Controller中的常用注解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解Java中的四種引用類型(強(qiáng)軟弱虛)

    詳解Java中的四種引用類型(強(qiáng)軟弱虛)

    Java中的引用類型主要分為四種,分別是強(qiáng)引用、軟引用、弱引用和虛引用,這篇文章主要為大家詳細(xì)介紹了四者的使用與區(qū)別,需要的小伙伴可以參考下
    2023-10-10
  • 舉例講解Java的RTTI運(yùn)行時(shí)類型識(shí)別機(jī)制

    舉例講解Java的RTTI運(yùn)行時(shí)類型識(shí)別機(jī)制

    這篇文章主要介紹了Java的RTTI運(yùn)行時(shí)類型識(shí)別機(jī)制,包括泛化的Class引用以及類型檢查instanceof等知識(shí)點(diǎn),需要的朋友可以參考下
    2016-05-05

最新評(píng)論

平顺县| 扎鲁特旗| 马边| 马关县| 周至县| 育儿| 汉沽区| 霍山县| 吴堡县| 射洪县| 海林市| 新密市| 北川| 苍南县| 江北区| 南投县| 油尖旺区| 旌德县| 望城县| 察雅县| 三河市| 盐池县| 鄂温| 晴隆县| 建瓯市| 景东| 苏尼特左旗| 宜君县| 九江市| 靖宇县| 梁河县| 江北区| 紫云| 弋阳县| 双辽市| 云阳县| 齐齐哈尔市| 林芝县| 唐海县| 英德市| 鹤岗市|