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

Java中的靜態(tài)代碼塊與構(gòu)造代碼塊詳解

 更新時間:2024年11月04日 14:50:13   作者:薛定諤的鹽.  
靜態(tài)代碼塊在JVM加載類時執(zhí)行,僅執(zhí)行一次,用于初始化靜態(tài)變量或執(zhí)行一次性設(shè)置,構(gòu)造代碼塊在每次創(chuàng)建對象時執(zhí)行,用于實例變量的初始化或執(zhí)行創(chuàng)建對象時的公共邏輯,靜態(tài)代碼塊按定義順序執(zhí)行,構(gòu)造代碼塊在構(gòu)造方法前執(zhí)行

1、靜態(tài)代碼塊

1. 底層原理

靜態(tài)代碼塊在類的字節(jié)碼被加載到JVM時執(zhí)行,并且在整個JVM生命周期中只會執(zhí)行一次。

JVM在加載類時,先加載類的字節(jié)碼,接著在類中查找靜態(tài)成員和靜態(tài)代碼塊。

所有的靜態(tài)代碼塊會按照它們在類中定義的順序依次執(zhí)行。

2. 執(zhí)行時機

靜態(tài)代碼塊的執(zhí)行時機是在類加載過程中。類加載通常發(fā)生在以下情況之一時:

  • 類的第一個實例被創(chuàng)建。
  • 訪問類的第一個靜態(tài)成員(靜態(tài)變量或靜態(tài)方法)。
  • 使用反射機制來加載類。

當滿足上述任一條件時,JVM會加載該類,并執(zhí)行類中的所有靜態(tài)代碼塊。

3. 作用

  • 初始化靜態(tài)變量:可以在靜態(tài)代碼塊中對靜態(tài)變量進行復(fù)雜的初始化操作。
  • 執(zhí)行一次性設(shè)置:比如加載配置文件、初始化數(shù)據(jù)庫連接池等,僅需要在類加載時執(zhí)行一次的操作。
  • 用于捕捉類的加載時間點:有時我們希望在類加載時執(zhí)行某些邏輯,靜態(tài)代碼塊是一個非常合適的地方。

4. 示例

public class StaticBlock {
    static {
        System.out.println("靜態(tài)代碼塊 1 被執(zhí)行。");
    }
    
    static int staticVar = initStaticVar();

    static {
        System.out.println("靜態(tài)代碼塊 2 被執(zhí)行。");
    }
    
    private static int initStaticVar() {
        System.out.println("靜態(tài)變量被初始化。");
        return 1024;
    }
    
    public static void main(String[] args) {
        System.out.println("主方法被執(zhí)行。");
        System.out.println("靜態(tài)變量staticVar的值為: " + staticVar);
    }
}

運行結(jié)果為:

靜態(tài)代碼塊 1 被執(zhí)行。
靜態(tài)變量被初始化。
靜態(tài)代碼塊 2 被執(zhí)行。
主方法被執(zhí)行。
靜態(tài)變量staticVar的值為: 1024

在這個示例中:

  • 靜態(tài)代碼塊按照它們在類中定義的順序執(zhí)行。
  • 靜態(tài)變量 staticVar 的初始化發(fā)生在第一個靜態(tài)代碼塊和第二個靜態(tài)代碼塊之間。
  • 這些操作只在類首次加載時執(zhí)行一次。

2、構(gòu)造代碼塊

1. 底層原理

構(gòu)造代碼塊是在每次創(chuàng)建對象時執(zhí)行的。JVM在構(gòu)造對象的過程中,會在調(diào)用構(gòu)造方法之前執(zhí)行構(gòu)造代碼塊。

構(gòu)造代碼塊可以用于在對象創(chuàng)建時對實例變量進行初始化,或者執(zhí)行一些在每次創(chuàng)建對象時需要執(zhí)行的代碼。

2. 執(zhí)行時機

每次創(chuàng)建對象時,JVM首先會在堆內(nèi)存中分配對象的內(nèi)存,然后按照以下步驟執(zhí)行:

  • 初始化實例變量為默認值。
  • 執(zhí)行構(gòu)造代碼塊,按它們在類中定義的順序執(zhí)行。
  • 執(zhí)行構(gòu)造方法。

因此,構(gòu)造代碼塊的執(zhí)行是在構(gòu)造方法之前的,即使在構(gòu)造方法中進行實例變量的賦值,構(gòu)造代碼塊中的代碼也會先于這些操作執(zhí)行。

3. 作用

  • 實例變量的復(fù)雜初始化:構(gòu)造代碼塊適合用來進行實例變量的復(fù)雜初始化操作,尤其是當初始化邏輯需要在多個構(gòu)造方法中共享時。
  • 每次創(chuàng)建對象時執(zhí)行的邏輯:構(gòu)造代碼塊中的代碼每次創(chuàng)建對象時都會執(zhí)行,所以可以用來在對象創(chuàng)建時執(zhí)行一些公共的邏輯。

4. 示例

public class ConstructBlock {
    {
        System.out.println("構(gòu)造代碼塊 1 被執(zhí)行。");
    }
    
    int constructVar = initConstructVar();
    
    {
        System.out.println("構(gòu)造代碼塊 2 被執(zhí)行。");
    }
    
    private int initConstructVar() {
        System.out.println("成員變量被初始化。");
        return 1024;
    }
    
    public ConstructBlock() {
        System.out.println("構(gòu)造方法被執(zhí)行。");
    }
    
    public static void main(String[] args) {
        System.out.println("創(chuàng)建第一個對象:");
        new ConstructBlock();
        
        System.out.println("\n創(chuàng)建第二個對象:");
        new ConstructBlock();
    }
}

運行結(jié)果為:

創(chuàng)建第一個對象:
構(gòu)造代碼塊 1 被執(zhí)行。
成員變量被初始化。
構(gòu)造代碼塊 2 被執(zhí)行。
構(gòu)造方法被執(zhí)行。

創(chuàng)建第二個對象:
構(gòu)造代碼塊 1 被執(zhí)行。
成員變量被初始化。
構(gòu)造代碼塊 2 被執(zhí)行。
構(gòu)造方法被執(zhí)行。

在這個示例中:

  • 每次創(chuàng)建對象時,構(gòu)造代碼塊和實例變量的初始化邏輯都會執(zhí)行。
  • 無論你調(diào)用哪個構(gòu)造方法,構(gòu)造代碼塊都將被執(zhí)行,從而確保一些邏輯可以在所有構(gòu)造方法執(zhí)行前運行。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java后端接收前端數(shù)據(jù)的五種方法

    Java后端接收前端數(shù)據(jù)的五種方法

    本文概述了前后端分離中Vue與Java的數(shù)據(jù)交互方式,包括JSON、表單、URL參數(shù)、文件上傳及路徑參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-08-08
  • Mybatis-Plus自動生成id涉及的問題解決過程

    Mybatis-Plus自動生成id涉及的問題解決過程

    文章主要講述了解決用戶ID在頁面和數(shù)據(jù)庫中不一致的問題,并提供了兩種解決方案:將主鍵類型改為String或刪除數(shù)據(jù)庫表重新創(chuàng)建以清空最大id
    2025-12-12
  • Spring整合redis的操作代碼

    Spring整合redis的操作代碼

    這篇文章主要介紹了Spring整合redis的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • JPA配置詳解之jpaProperties用法

    JPA配置詳解之jpaProperties用法

    這篇文章主要介紹了JPA配置詳解之jpaProperties用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring動態(tài)修改bean屬性配置key的幾種方法

    Spring動態(tài)修改bean屬性配置key的幾種方法

    在Spring應(yīng)用開發(fā)中,我們經(jīng)常需要從配置文件讀取屬性值并注入到bean中,但是你有沒有遇到過這種情況:某個bean的屬性需要根據(jù)運行環(huán)境動態(tài)切換配置key? 比如測試環(huán)境和生產(chǎn)環(huán)境使用不同的數(shù)據(jù)庫配置前綴?今天我們就來探討這個看似簡單卻經(jīng)常讓人頭疼的問題
    2025-04-04
  • 圖解Java經(jīng)典算法折半查找的原理與實現(xiàn)

    圖解Java經(jīng)典算法折半查找的原理與實現(xiàn)

    折半查找法也叫做?分查找,顧名思義就是把數(shù)據(jù)分成兩半,再判斷所查找的key在哪?半中,再重復(fù)上述步驟知道找到?標key,下面這篇文章主要介紹了圖解Java經(jīng)典算法折半查找的原理與實現(xiàn)
    2022-09-09
  • 基于module-info.class的問題

    基于module-info.class的問題

    這篇文章主要介紹了基于module-info.class的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java數(shù)組及arrays類對數(shù)組的操作實例

    java數(shù)組及arrays類對數(shù)組的操作實例

    下面小編就為大家?guī)硪黄猨ava數(shù)組及arrays類對數(shù)組的操作實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringBoot使用Redisson時候進行Redis事務(wù)回滾方式

    SpringBoot使用Redisson時候進行Redis事務(wù)回滾方式

    這篇文章主要介紹了SpringBoot使用Redisson時候進行Redis事務(wù)回滾方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Intellij Idea 多模塊Maven工程中模塊之間無法相互引用問題

    Intellij Idea 多模塊Maven工程中模塊之間無法相互引用問題

    這篇文章主要介紹了Intellij Idea 多模塊Maven工程中模塊之間無法相互引用問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01

最新評論

介休市| 清河县| 宝丰县| 东台市| 横峰县| 长沙市| 改则县| 佛冈县| 夏邑县| 镇赉县| 塔城市| 邯郸市| 丽江市| 招远市| 高邑县| 洱源县| 石城县| 焉耆| 湘潭县| 临武县| 瓦房店市| 定远县| 太湖县| 韩城市| 北碚区| 赣州市| 略阳县| 勃利县| 榕江县| 成安县| 金门县| 祁阳县| 固原市| 常州市| 罗定市| 武乡县| 山东省| 龙门县| 兴仁县| 焉耆| 白银市|