Java之static靜態代碼塊


Java之static靜態代碼塊

構造代碼塊

使用{}包裹的代碼區域,這里的代碼區域特指位於class{}下面的而不是存在於其他type method(){}這類函數下面的代碼區域

public class HelloA {
    /**
    ...
    */
    {
        System.out.println("I'm A construct code block");
    }

}


構造函數代碼塊

構造函數代碼塊指的是構造函數中所包含的代碼,類似 className(){}中的代碼塊

public class HelloA {
    public HelloA(){
        System.out.println("I'm A construct method code block");
    }
}


static代碼塊

static代碼塊指的是static{}包裹的代碼塊,且靜態代碼只執行一次,可以通過Class.forName("classPath")的方式喚醒代碼的static代碼塊,但是也執行一次。

public class HelloA {
    static{
        System.out.println("I'm A static code block");
    }

}

三種代碼方式的執行順序

public class HelloA {
    public HelloA(){
        System.out.println("I'm A construct method code block");
    }
    {
        System.out.println("I'm A construct code block");
    }

    static {
        System.out.println("I'm A static code block");
    }

    public static void main(String[] args) {
        new HelloA();
        new HelloA();

    }
}

result

I'm A static code block
I'm A construct code block
I'm A construct method code block
I'm A construct code block
I'm A construct method code block

可以看到顯示static代碼初始化,然后是構造方法初始化,然后是構造函數初始化,並且靜態代碼只會初始化一次。

為什么構造代碼塊一定在構造函數代碼塊前執行

這里可以直接代碼編譯后的文件HelloA.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class HelloA {
   /*構造代碼塊直接被內聯到了構造函數代碼塊中*/
    public HelloA() {
        System.out.println("I'm A construct code block");
        System.out.println("I'm A construct method code block");
    }

    public static void main(String[] args) {
        new HelloA();
        new HelloA();
    }

    static {
        System.out.println("I'm A static code block");
    }
}

因此得出結論構造代碼塊直接被內聯到構造函數代碼塊中

並且還可以推論可以直接在構造代碼塊中調用this或者調用this.method()或者this.staticMethod();

加上繼承的情況

public class HelloB extends HelloA {
    {
        System.out.println("I'm A construct  code block");
    }

    public HelloB() {
        System.out.println("I'm A construct method code block");
    }

    static {
        System.out.println("I'm B static code block");
    }

    public static void main(String[] args) {
        new HelloB();
    }
}

result

I'm A static code block
I'm B static code block
I'm A construct code block
I'm A construct method code block
I'm A construct code block
I'm A construct method code block

初始化的整體順序可以漸進的表示為

static > instace

有繼承初始化順序:

另一個靜態提升的題見csdn

https://blog.csdn.net/harryptter/article/details/87875399#筆試題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM