JAVA中的靜態(tài)代碼塊

在看android源碼的時(shí)候看到了好久不見(jiàn)的靜態(tài)代碼塊,寫個(gè)小栗子來(lái)回憶一下這部分。

包含靜態(tài)代碼塊的類A:

class A{
    static int va = 1;
    static String sa = "1";
    public A(){
        System.out.println("構(gòu)造方法a");
    }
    
    {
        System.out.println("代碼塊a");
    }
    
    static{
        System.out.println("靜態(tài)代碼塊a");
    }
    
    static{
        System.out.println("靜態(tài)代碼塊a1");
    }
    
    public static void printStaticValue(){
        System.out.println(sa);
    }
    
    public void printValue(){
        System.out.println("=====a=====");
        System.out.println(va);
        System.out.println(sa);
    }
}

繼承父類A并且同樣包含靜態(tài)代碼塊的類B:

class B extends A{

    public B(){
        System.out.println("構(gòu)造方法b");
    }
    
    {
        System.out.println("代碼塊b");
    }
    
    static{
        System.out.println("靜態(tài)代碼塊b1");
    }
    
    static{
        System.out.println("靜態(tài)代碼塊b");
    }
    
    public void printValue(){
        System.out.println("=====super=====");
        super.printValue();
        System.out.println("=====b=====");
        System.out.println(va);
        System.out.println(sa);
    }
}

調(diào)用上面的類:

public class Teststatic {
    public static void main(String[] args) {
        System.out.println("------b--------");
        B b = new B();
        System.out.println("------b again--------");
        b = new B();
        System.out.println("------b1--------");
        B b1 = new B();
        System.out.println("------通過(guò)b1來(lái)打印一下靜態(tài)變量");
        b1.printValue();
    }

}

運(yùn)行結(jié)果如下:

------b--------
靜態(tài)代碼塊a
靜態(tài)代碼塊a1
靜態(tài)代碼塊b1
靜態(tài)代碼塊b
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b again--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b1--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------通過(guò)b1來(lái)打印一下靜態(tài)變量
=====super=====
=====a=====
1
1
=====b=====
1
1

可以看到無(wú)論生成多少個(gè)對(duì)象,靜態(tài)代碼塊只執(zhí)行一次,且靜態(tài)代碼塊之間按照書寫順序來(lái)執(zhí)行。

在上面基礎(chǔ)上添加一行類調(diào)用靜態(tài)方法的代碼:

public class Teststatic {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("------我先來(lái)執(zhí)行以下靜態(tài)方法-------");
        B.printStaticValue();//雖然b中沒(méi)有該靜態(tài)方法,但是繼承了A,所以也就繼承了A中的公共方法
        System.out.println("------b--------");
        B b = new B();
        System.out.println("------b again--------");
        b = new B();
        System.out.println("------b1--------");
        B b1 = new B();
        System.out.println("------通過(guò)b1來(lái)打印一下靜態(tài)變量");
        b1.printValue();
    }
}

運(yùn)行結(jié)果如下:

------我先來(lái)執(zhí)行以下靜態(tài)方法-------
靜態(tài)代碼塊a
靜態(tài)代碼塊a1
1
------b--------
靜態(tài)代碼塊b1
靜態(tài)代碼塊b
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b again--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b1--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------通過(guò)b1來(lái)打印一下靜態(tài)變量
=====super=====
=====a=====
1
1
=====b=====
1
1

可以看到通過(guò)類調(diào)用靜態(tài)方法時(shí)同樣會(huì)先執(zhí)行靜態(tài)代碼塊。

【待續(xù)...】
相關(guān)博文:
兩個(gè)例子徹底搞懂Java類屬性,代碼塊,構(gòu)造方法的執(zhí)行順序
為什么構(gòu)造代碼塊先于構(gòu)造函數(shù)執(zhí)行?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容