Java中的靜態初始化和非靜態初始化

1. Java中的初始化

Java與C++的一個不同之處在於,Java不僅有構造函數,還有一個“初始化塊”(Initialization Block)的概念。Java中的初始化塊在創建Java對象時隱式執行,並且是在構造函數之前執行。

2. 靜態初始化

// 定義
static {
    ...
}

靜態初始化塊執行的優先級高於非靜態初始化塊,在對象裝載到JVM中時執行一次,僅能初始化類成員變量,即static修飾的數據成員。

3. 非靜態初始化

// 定義
{
    ...
}

非靜態初始化塊在每個對象生成時都會被執行一次,它可以初始化類的實例變量。非靜態初始化塊在構造函數之前執行。

4. Demo

Example

class Test {

    static {
        System.out.println("Run static initailization block.");
    }

    {
        System.out.println("Run nonstatic initailization block.");
    }

    public Test() {
        System.out.println("Run Test constructor.");
    }

    public static void main(String[] args) {
        Test t = new Test();
    }
}
  • 運行結果
Run static initailization block.
Run nonstatic initailization block.
Run Test constructor.

5. 總結

從某種程度上來看,初始化塊是構造器的補充,初始化塊總是在構造器之前執行。初始化塊是一段固定執行的代碼,它不能接受任何參數。因此初始化塊對同一個類的所有對象所進行的初始化處理完全相同。如果有一段初始化處理代碼對所有的對象完全相同,且無需接受任何參數,就可以把這段初始化處理代碼提取到初始化塊中。通過把多個構造器中的相同代碼提取到初始化塊中定義,能更好地提高初始化代碼的複用。靜態初始化塊是類相關的,系統將在類加載時執行靜態初始化塊,而不是在創建對象時才執行,因此靜態初始化塊總是比非靜態初始化塊先執行。用途:例如在JNI調用時,需要加載動態鏈接庫,就可以在靜態代碼塊中加載。

 

原文:https://blog.csdn.net/quincuntial/article/details/54291803

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章