構造代碼塊與靜態代碼塊(靜態初始化塊)

構造代碼塊與靜態代碼塊(靜態初始化塊)

1.構造代碼塊:每次創建對象時執行
2.靜態代碼塊(靜態初始化塊):JVM加載類(加載在運行之前)時執行,靜態代碼塊(靜態初始化塊)只執行一次

爲啥需要靜態初始化塊?

靜態初始化塊主要用來初始化類變量

類變量可以在構造函數中初始化爲啥還要定義靜態初始化塊呢?

因爲,類變量可以通過類名.類變量的形式調用,有的時候我們不想爲了初始化類變量而創建對象,所以就有了靜態初始化塊。
靜態初始化塊可以在類加載的時候執行一次。避免了了初始化類變量而創建對象

3.public static B t1 = new B();是類變量及引用(靜態變量及靜態引用)的初始化

4.執行順序:類變量及引用(靜態變量及靜態引用)的初始化(默認初始化或“=”顯示賦值)->靜態代碼塊(靜態初始化塊,堆默認初始化的類變量根據需要重新初始化)->main()->實例變量及引用的初始化->構造代碼塊->構造方法

例:

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("構造塊");
    }
    static
    {
        System.out.println("靜態塊");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

輸出如下:
構造塊
構造塊
靜態塊
構造塊
原因
類變量及引用(靜態變量及靜態引用)的初始化(默認初始化或“=”顯示賦值)優先於靜態初始化塊(靜態塊)執行,接下來靜態初始化塊(靜態塊)按照申明順序執行,
首先,執行public staticB t1 = newB();該語句創建對象,則會調用構造代碼塊,輸出第一個構造塊

其次,執行public static B t2 = new B();該語句又創建新對象,則又會調用構造代碼塊,輸出第二個構造塊

接着,再按照靜態代碼塊申明順序執行下面的靜態代碼塊:輸出靜態塊

static
{
    System.out.println("靜態塊");
}

最後,main方法執行,創建對象,輸出構造塊

發佈了24 篇原創文章 · 獲贊 52 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章