亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)方法)。
  • 使用反射機制來加載類。

當(dāng)滿足上述任一條件時,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í)行:

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

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

3. 作用

  • 實例變量的復(fù)雜初始化:構(gòu)造代碼塊適合用來進行實例變量的復(fù)雜初始化操作,尤其是當(dāng)初始化邏輯需要在多個構(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)文章

最新評論