許多小伙伴對於java中的三種初始化塊的執行順序一直感到頭疼,接下來我們就來分析一下這三種初始化塊到底是怎麼運行的。有些公司也會將這個問題作為筆試題目。 下麵通過一段代碼來看看創建對象時這麼初始化塊是如何運行的 package com.hxy; public class CodeBlock{ pub ...
許多小伙伴對於java中的三種初始化塊的執行順序一直感到頭疼,接下來我們就來分析一下這三種初始化塊到底是怎麼運行的。有些公司也會將這個問題作為筆試題目。
下麵通過一段代碼來看看創建對象時這麼初始化塊是如何運行的
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"); } }
運行結果如下圖所示:
從運行結果來看,在新創建一個對象的時候,程式先執行初始化塊,再執行構造器。
當普通初始化塊被static修飾後就變成了靜態初始化塊,也被稱作類初始化塊。
普通初始化塊是對對象進行初始化,而靜態初始化塊是對類進行初始化。所以靜態初始化塊要比普通初始化塊先執行。
從上面的運行結果看。當第一次創建HelloB對象時,要先載入並初始化HelloB類。初始化HelloB類會先執行它父類的靜態初始塊(Static A),然後再執行它的靜態初始化塊。
綜上所述:初始化塊的執行順序為:靜態初始化塊、普通初始化塊、構造器。
接下來再看創建兩個HelloB對象時它們又是怎麼運行的。下麵是運行結果:
從運行結果來看,可能出乎一些小伙伴的預料。
靜態初始化塊只在第一次創建對象時執行,也就是說不管創建幾次對象。靜態初始化塊都只會執行一次。普通代碼塊和構造器則是創建幾次執行幾次,且普通代碼塊比構造器先執行。