Java程式碼塊(構造塊、靜態程式碼塊、普通程式碼塊)
阿新 • • 發佈:2018-10-31
在Java中根據程式碼塊出現的位置以及關鍵字,分為下列四中程式碼塊:
1.普通程式碼塊
定義在方法中的程式碼塊
2.構造塊
定義在類中的程式碼塊,不加任何修飾符
{
}
在物件產生時,優先於構造方法執行,有幾個物件產生,就呼叫幾次構造塊。
用於在構造方法執行前完成一些屬性的初始化操作
3.靜態程式碼塊
A.非主類中的靜態程式碼塊
static{ }
在類載入時執行(什麼時候用到類)
優先於構造塊執行,無論有多少物件產生,只會呼叫一次。
B.主類的靜態程式碼塊
static { }
主類中的靜態塊優先於主方法執行
public static void main(String[] args) { new Test(); //構造兩個Test匿名物件 new Test(); }
//主類中靜態程式碼塊 public class Codeblock { public Codeblock() { System.out.println("主類構造方法"); } static //靜態程式碼塊 { System.out.println("主類靜態程式碼塊"); } { System.out.println("主類構造塊"); } public static void main(String[] args) { System.out.println("--main start--"); new Codeblock(); //匿名物件 會調構造方法和構造塊 new Codeblock(); //匿名物件 System.out.println("--main end--"); } }
因為會先載入主類,所以會先呼叫靜態程式碼塊,然後才是主方法。
如果是繼承關係,在子類中,對子類物件的操作,會先載入父類,然後載入子類。
阿里面試題:
//靜態程式碼塊在載入類的時候用到 //構造塊和建構函式在物件產生時,構造塊優先於建構函式 class HelloA { public HelloA() { System.out.println("父類構造方法"); } { System.out.println("父類構造塊"); } static { System.out.println("父類靜態程式碼塊"); } } public class HelloB extends HelloA { public HelloB() { System.out.println("子類構造方法"); } { System.out.println("子類構造塊"); } static { System.out.println("子類靜態塊"); } public static void main(String[] args) { System.out.println("--stat---"); HelloB b1=new HelloB(); //呼叫構造塊和建構函式 HelloB b2=new HelloB(); System.out.println("--end--"); } }
4.同步程式碼塊(多執行緒部分再講)