關於java中三種初始化塊的執行順序

許多小夥伴對於java中的三種初始化塊的執行順序一直感到頭疼,接下來咱們就來分析一下這三種初始化塊究竟是怎麼運行的。有些公司也會將這個問題做爲筆試題目。java

下面經過一段代碼來看看建立對象時這麼初始化塊是如何運行的spa

package com.hxy;
public class CodeBlock{
    public static void main(String[] args) {
        new HelloB();
       // new HelloB();
    }

}
class HelloA{
    //無參構造器
    public HelloA(){
        System.out.println("Hello A");
    }
    //初始化塊
    {
        System.out.println("I'm A");
    }
    //靜態初始化塊
    static{
        System.out.println("Static A");
    }
}
class HelloB extends HelloA{
    public HelloB(){
        System.out.println("Hello B");
    }
    {
        System.out.println("I'm B");
    }
    static{
        System.out.println("Static B");
    }
}

運行結果以下圖所示:code

 

 從運行結果來看,在新建立一個對象的時候,程序先執行初始化塊,再執行構造器。對象

當普通初始化塊被static修飾後就變成了靜態初始化塊,也被稱做類初始化塊blog

普通初始化塊是對對象進行初始化,而靜態初始化塊是對類進行初始化。因此靜態初始化塊要比普通初始化塊先執行。class

從上面的運行結果看。當第一次建立HelloB對象時,要先加載並初始化HelloB類。初始化HelloB類會先執行它父類的靜態初始塊(Static A),而後再執行它的靜態初始化塊。程序

綜上所述:初始化塊的執行順序爲:靜態初始化塊、普通初始化塊、構造器。im

接下來再看建立兩個HelloB對象時它們又是怎麼運行的。下面是運行結果:筆試

 

 從運行結果來看,可能出乎一些小夥伴的預料。static

靜態初始化塊只在第一次建立對象時執行,也就是說無論建立幾回對象。靜態初始化塊都只會執行一次。普通代碼塊和構造器則是建立幾回執行幾回,且普通代碼塊比構造器先執行。

相關文章
相關標籤/搜索