靜態程式碼塊、構造程式碼塊、構造方法

weixin_34126215發表於2014-04-10

靜態程式碼塊、構造程式碼塊和構造方法的執行的先後順序。
  答案是:靜態程式碼塊 > 構造程式碼塊 > 構造方法
  首先回答這個問題,需要弄清楚靜態程式碼塊和構造程式碼塊各是什麼。
  構造程式碼塊:其實就是類中被花括號包起來的一段程式碼
  靜態程式碼塊:有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
    構造程式碼塊
  除了構造程式碼塊和靜態程式碼塊之外,還有在方法中的程式碼塊--區域性程式碼塊。大家都知道變數都有作用域,而區域性程式碼塊最常用的就是限定變數的生命週期,使變數佔用的空間儘可能早的被釋放。
  所以,三種的型別的程式碼塊各有各的用處:
區域性程式碼塊:限定變數的生命週期,及早釋放空間;
構造程式碼塊:可抽取構造方法中相同的程式碼出來,提高程式碼利用;
靜態程式碼塊:適用於一個類中只執行一次的程式碼。

相關文章