靜態程式碼塊、構造程式碼塊和構造方法的執行的先後順序。
答案是:靜態程式碼塊 > 構造程式碼塊 > 構造方法
首先回答這個問題,需要弄清楚靜態程式碼塊和構造程式碼塊各是什麼。
構造程式碼塊:其實就是類中被花括號包起來的一段程式碼
靜態程式碼塊:有static關鍵字修飾的構造程式碼塊。
看看例子:
package cn.reflect; public class Demo { private String name; public Demo() { System.out.println("HelloWorld"); } public Demo(String name) { this.name = name; } public static void main(String[] args) { new Demo(); new Demo("banana"); } //構造程式碼塊 { System.out.println("構造程式碼塊"); } //靜態程式碼塊 static { System.out.println("靜態程式碼塊"); } }
為了看清效果,特意將構造程式碼塊放在了靜態程式碼塊的前面,又將這兩個程式碼塊放到類的最後,但是不管怎麼放程式碼塊,結果是不變的,先輸出“靜態程式碼塊”,即便是main方法中沒有new物件也會輸出“靜態程式碼塊”,這就得從靜態的特點說起,類中被static修飾的成員是隨著類的載入而載入,所以只要類載入了,靜態的東西就存在了,因此沒有new物件也會輸出“靜態程式碼塊”而且只有一次。而構造程式碼塊之所以叫構造程式碼塊,正是因為只有構造被呼叫時才會執行,所以每次有構造被呼叫時,構造程式碼塊都會執行一次,並且是先執行構造程式碼塊,再執行構造。
所以上面程式的執行結果是:
靜態程式碼塊
構造程式碼塊
HelloWorld
構造程式碼塊
除了構造程式碼塊和靜態程式碼塊之外,還有在方法中的程式碼塊--區域性程式碼塊。大家都知道變數都有作用域,而區域性程式碼塊最常用的就是限定變數的生命週期,使變數佔用的空間儘可能早的被釋放。
所以,三種的型別的程式碼塊各有各的用處:
區域性程式碼塊:限定變數的生命週期,及早釋放空間;
構造程式碼塊:可抽取構造方法中相同的程式碼出來,提高程式碼利用;
靜態程式碼塊:適用於一個類中只執行一次的程式碼。