首頁 > Java > java教程 > Java繼承中靜態區塊和實例區塊的初始化順序是什麼?

Java繼承中靜態區塊和實例區塊的初始化順序是什麼?

Patricia Arquette
發布: 2024-11-27 07:00:14
原創
204 人瀏覽過

What's the Initialization Order of Static and Instance Blocks in Java Inheritance?

Java 中靜態和實例區塊的初始化順序

在Java 中使用多個類別時,了解靜態和實例的執行順序初始化塊變得至關重要。雖然眾所周知,在一個類別中,這些區塊按照出現的順序運行,但它們在類別之間的行為仍然存在不確定性。

要示範此行為,請考慮以下程式碼:

package pkg;

public class LoadTest {
    public static void main(String[] args) {
        System.out.println("START");
        new Child();
        System.out.println("END");
    }
}

class Parent extends Grandparent {
    // Instance init block
    {
        System.out.println("instance - parent");
    }

    // Constructor
    public Parent() {
        System.out.println("constructor - parent");
    }

    // Static init block
    static {
        System.out.println("static - parent");
    }
}

class Grandparent {
    // Static init block
    static {
        System.out.println("static - grandparent");
    }

    // Instance init block
    {
        System.out.println("instance - grandparent");
    }

    // Constructor
    public Grandparent() {
        System.out.println("constructor - grandparent");
    }
}

class Child extends Parent {
    // Constructor
    public Child() {
        System.out.println("constructor - child");
    }

    // Static init block
    static {
        System.out.println("static - child");
    }

    // Instance init block
    {
        System.out.println("instance - child");
    }
}
登入後複製

預期,此程式碼的輸出與靜態區塊在實例區塊之前執行的假設一致:

START
static - grandparent
static - parent
static - child
instance - grandparent
constructor - grandparent
instance - parent
constructor - parent
instance - child
constructor - child
END
登入後複製

但是,僅此觀察並不能澄清父類和子類之間的初始化順序。要進一步探索這方面,請考慮將以下未使用的類別添加到程式碼中:

class IAmAClassThatIsNeverUsed {
    // Constructor
    public IAmAClassThatIsNeverUsed() {
        System.out.println("constructor - IAACTINU");
    }

    // Instance init block
    {
        System.out.println("instance - IAACTINU");
    }

    // Static init block
    static {
        System.out.println("static - IAACTINU");
    }
}
登入後複製

值得注意的是,修改後的程式碼仍然產生與原始程式碼相同的輸出。這意味著靜態和實例初始化區塊按以下順序執行:

  • 所有類別和介面的靜態初始化區塊都按照廣度優先從上到下的順序執行,無論它們的依賴關係如何
  • 執行完所有靜態初始化區塊後,所有類別的實例初始化區塊和建構函數將按照類別在類別中初始化的順序執行。

此行為符合 Java 語言規範 (JLS),該規範在第 12.4 和 12.5 節中提供了詳細說明。

以上是Java繼承中靜態區塊和實例區塊的初始化順序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板