1. 程式人生 > >Java程式碼塊(構造塊、靜態程式碼塊、普通程式碼塊)

Java程式碼塊(構造塊、靜態程式碼塊、普通程式碼塊)

在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.同步程式碼塊(多執行緒部分再講)