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

Java中的類初始化解析

 更新時(shí)間:2023年08月14日 08:56:11   作者:IT_GJW  
這篇文章主要介紹了Java中的類初始化解析,類的初始化是一個(gè)Java類生命周期中的其中一個(gè)階段,初始化是類加載的最后一個(gè)階段,也正是在初始化階段,才會(huì)真正開始執(zhí)行類中所寫的Java代碼,需要的朋友可以參考下

類的初始化

類的初始化是一個(gè)Java類生命周期中的其中一個(gè)階段。

如下圖所示:

生命周期中的前五個(gè)階段(加載、驗(yàn)證、準(zhǔn)備、解析、初始化)是一個(gè)類在JVM中的完整加載過程。

初始化是類加載的最后一個(gè)階段,也正是在初始化階段,才會(huì)真正開始執(zhí)行類中所寫的Java代碼。

Java虛擬機(jī)規(guī)范中嚴(yán)格規(guī)定了有且只有四種情況必須立即對(duì)類進(jìn)行初始化:

1.遇到new、getstatic、putstatic、或者invoicestatic這4條字節(jié)碼指令時(shí),如果類沒有進(jìn)行過初始化,則需要觸發(fā)其初始化。生成這4條指令的最常見的Java代碼場(chǎng)景是:使用new關(guān)鍵字實(shí)例化對(duì)象、讀取或設(shè)置一個(gè)類的靜態(tài)字段(被final修飾、已在編譯期就把結(jié)果放入常量池的靜態(tài)字段除外)的時(shí)候,以及調(diào)用一個(gè)類的靜態(tài)方法的時(shí)候。

2.使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用的時(shí)候,如果類沒有進(jìn)行過初始化,則需要先觸發(fā)其初始化。

3.當(dāng)初始化一個(gè)類的時(shí)候,如果發(fā)現(xiàn)父類還沒有進(jìn)行過初始化,需要先觸發(fā)其父類的初始化。

4.當(dāng)虛擬機(jī)啟動(dòng)時(shí),用戶需要指定一個(gè)主類(包含main方法的那個(gè)類),虛擬機(jī)會(huì)先初始化這個(gè)主類。

這四種場(chǎng)景中的行為稱為對(duì)一個(gè)類進(jìn)行主動(dòng)引用,除此之外引用類的方式,都不會(huì)觸發(fā)初始化,被稱為被動(dòng)引用。

初始化一個(gè)類時(shí),最先執(zhí)行的是靜態(tài)域中代碼,而靜態(tài)域中包含靜態(tài)變量、靜態(tài)塊和靜態(tài)方法,其中需要初始化的是靜態(tài)變量和靜態(tài)塊,這兩者的執(zhí)行順序由代碼的書寫順序決定。

靜態(tài)域中的代碼只會(huì)被執(zhí)行一次。如果是使用new關(guān)鍵字實(shí)例化對(duì)象,靜態(tài)域中的代碼被執(zhí)行后,緊接著會(huì)執(zhí)行構(gòu)造代碼塊和構(gòu)造函數(shù)來實(shí)例化對(duì)象,這部分代碼會(huì)執(zhí)行多次,每次使用new關(guān)鍵字實(shí)例化對(duì)象時(shí),這部分代碼都會(huì)執(zhí)行。可以用如下一段程序驗(yàn)證這些代碼的執(zhí)行順序:

public class ClassInitTest {
    public static ClassInitTest c1 = new ClassInitTest();
    public static ClassInitTest c2 = new ClassInitTest();
    {
        System.out.println("構(gòu)造代碼塊執(zhí)行");
    }
    static {
        System.out.println("靜態(tài)代碼塊執(zhí)行");
    }
    public ClassInitTest(){
        System.out.println("構(gòu)造方法被執(zhí)行");
    }
    public static void main(String[] args){
        System.out.println("main方法的第一行被執(zhí)行");
        ClassInitTest c = new ClassInitTest();
        System.out.println("main方法的第二行被執(zhí)行");
    }
}

ClassInitTest是主類,當(dāng)JVM啟動(dòng)時(shí)會(huì)對(duì)該類進(jìn)行初始化,首先初始化靜態(tài)域中的代碼,可以看到首先是兩個(gè)靜態(tài)變量c1和c2,對(duì)c1、c2聲明的同時(shí)進(jìn)行變量值的初始化,其值是實(shí)例對(duì)象,因此構(gòu)造代碼塊和構(gòu)造方法會(huì)被執(zhí)行,new了兩次,因此會(huì)被執(zhí)行兩次。

緊接著會(huì)執(zhí)行靜態(tài)代碼塊中的代碼。靜態(tài)域中的代碼執(zhí)行完畢后便開始執(zhí)行main方法,先是輸出一行語(yǔ)句,接著又實(shí)例化了一個(gè)對(duì)象,構(gòu)造代碼塊和構(gòu)造方法會(huì)被執(zhí)行,最后又輸出一行語(yǔ)句。因此執(zhí)行的結(jié)果如下:

如果存在繼承的情況,初始化子類時(shí),會(huì)先初始化父類,同時(shí)這幾類代碼執(zhí)行順序的優(yōu)先級(jí)保持不變。實(shí)例代碼如下:

public class Father {
    static {
        System.out.println("父類的靜態(tài)代碼塊被執(zhí)行");
    }
    {
        System.out.println("父類的構(gòu)造代碼塊被執(zhí)行");
    }
    public Father(){
        System.out.println("父類的構(gòu)造方法被執(zhí)行");
    }
}
public class Child extends Father{
    public Child(){
        System.out.println("子類構(gòu)造方法被執(zhí)行");
    }
    {
        System.out.println("子類的構(gòu)造代碼塊被執(zhí)行");
    }
    static {
        System.out.println("子類的靜態(tài)代碼塊被執(zhí)行");
    }
    public static void main(String [] args){
        new Child();
    }
}

執(zhí)行結(jié)果如下:

之所以子類的構(gòu)造方法執(zhí)行前會(huì)先執(zhí)行父類的構(gòu)造方法,是因?yàn)樽宇惖臉?gòu)造方法總是先調(diào)用父類的某個(gè)構(gòu)造方法,也就是說,如果子類沒有明顯地指明使用父類的哪個(gè)構(gòu)造方法,子類就調(diào)用父類不帶參數(shù)的構(gòu)造方法。

子類中使用super關(guān)鍵字調(diào)用父類的構(gòu)造方法,而且super必須是子類構(gòu)造方法的第一條語(yǔ)句,如果子類構(gòu)造方法中沒有明顯地寫出super關(guān)鍵字調(diào)用父類的哪個(gè)構(gòu)造方法,那么默認(rèn)在子類構(gòu)造方法中有如下語(yǔ)句(即使不寫):

super();//調(diào)用父類的無參構(gòu)造函數(shù)

當(dāng)然也可以在子類的構(gòu)造方法中顯式地用super語(yǔ)句指明調(diào)用父類的哪個(gè)構(gòu)造方法(如果父類有多個(gè)構(gòu)造方法的話)

super(實(shí)參列表);

到此這篇關(guān)于Java中的類初始化解析的文章就介紹到這了,更多相關(guān)Java類初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南

    SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南

    在項(xiàng)?開發(fā)中,對(duì)于前端提交的表單,后臺(tái)接?接收到表單數(shù)據(jù)后,為了保證程序的嚴(yán)謹(jǐn)性,通常后端會(huì)加?業(yè)務(wù)參數(shù)的合法校驗(yàn)操作來避免程序的?技術(shù)性?bug,這篇文章主要給大家介紹了關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法

    IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)

    Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    這篇文章主要介紹了Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解,本文主要是介紹幾種零拷貝的實(shí)現(xiàn)示例,以及與最傳統(tǒng)的做一個(gè)對(duì)比,看看在效率上到底有多大的提升,需要的朋友可以參考下
    2023-12-12
  • Java 調(diào)用Restful API接口的幾種方式(HTTPS)

    Java 調(diào)用Restful API接口的幾種方式(HTTPS)

    這篇文章主要介紹了Java 調(diào)用Restful API接口的幾種方式(HTTPS),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Spring如何使用三級(jí)緩存解決循環(huán)依賴

    Spring如何使用三級(jí)緩存解決循環(huán)依賴

    在Spring框架中,循環(huán)依賴是指兩個(gè)或多個(gè)Bean相互依賴,形成閉環(huán),導(dǎo)致無法完成初始化,此問題僅存在于單例Bean中,而原型Bean會(huì)拋出異常,Spring通過三級(jí)緩存及提前暴露策略解決循環(huán)依賴:一級(jí)緩存存放完全初始化的Bean
    2024-11-11
  • 詳解SpringBoot2.0的@Cacheable(Redis)緩存失效時(shí)間解決方案

    詳解SpringBoot2.0的@Cacheable(Redis)緩存失效時(shí)間解決方案

    這篇文章主要介紹了詳解SpringBoot2.0的@Cacheable(Redis)緩存失效時(shí)間解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列request分發(fā)

    SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列re

    這篇文章主要介紹了SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列request分發(fā) 的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Spring?Bean的8種加載方式總結(jié)

    Spring?Bean的8種加載方式總結(jié)

    以前學(xué)習(xí)Spring框架的時(shí)候,總結(jié)了幾種Bean的加載方式,不過老師說還有其它的加載方式,以下八種并不是全部,但也足以用來做很多事情了,希望對(duì)大家有所幫助
    2022-10-10
  • Java基礎(chǔ)泛型詳情

    Java基礎(chǔ)泛型詳情

    這篇文章主要介紹了Java基礎(chǔ)泛型詳情,泛型是JDK5中引入的特性,它提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許在編譯時(shí)檢測(cè)到非法的類型,下面文章的詳細(xì)介紹,需要的朋友可以參考一下
    2022-04-04

最新評(píng)論