許多小夥伴對於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
靜態初始化塊只在第一次建立對象時執行,也就是說無論建立幾回對象。靜態初始化塊都只會執行一次。普通代碼塊和構造器則是建立幾回執行幾回,且普通代碼塊比構造器先執行。