靜態代碼塊的執行方式和順序


1、靜態代碼塊格式:

static
{
  執行語句
}

特點:隨着類的加載而執行,且只執行一次,並優先於主函數。用於給類初始化的。

 

2、執行順序:

示例一

靜態代碼塊隨着類加載而加載

有多個靜態代碼塊的,按代碼塊前后順序加載

一個代碼塊,只執行一次。

package javastudy;

class StaticCode1{        
    static{                                //第4步。由第3步觸發。
        System.out.println("x");
    }
}

public class StaticDemo2 {
    static{                                //第1步。先加載主函數所在類,所以先加載並執行這段靜態代碼塊。
        System.out.println("y");
    }    
    public static void main(String[] args) {
        new StaticCode1();                //第3加載StaticCode1類。
        new StaticCode1();                //不執行。靜態代碼塊只執行一次
        System.out.println("over");        //第5步。輸出打印。
    }
    static{                                //第2步。多個靜態代碼塊之前,按前后順序執行
        System.out.println("z");
    }
}

輸出:

y
z
x
over

 

示例二

 

public class StaticDemo1 {                             

    public static void main(String[] args) {
        StaticDemo1 t1=new StaticDemo1();    //第2步,初始化構造函數,i=9
        System.out.println(t1.i);            //第3步,按順序執行,9
        speak();                            //第4步,按順序執行,調用靜態函數
        
    }    
    static int i=1;                            //靜態變量存到靜態區域。    
    static void speak()                        //靜態函數存到靜態區域。調用時執行。
    {
        System.out.println("a");;
    }
    static {                                //第1步,靜態代碼塊隨着類的加載,優先執行且只執行一次。i=3,i+3打印結果是4。
        i=i+3;
        System.out.println(i);
    }
    
    public StaticDemo1(){                    //構造方法,初始化時執行。
        i=i+5;                                //i=9
        System.out.println(i);    
    }
}

輸出:

4
9
9
a

 

 

示例三

package javastudy;

public class StaticDemo2 {
    public static void main(String[] args) {
    }
    static{                    //隨類加載就執行,不需要實例化
        System.out.println("z");
    }
}

輸出:

z

 

示例四

class StaticCode2{        
    
    StaticCode2(){                        //沒有調用。
        System.out.println("aa");
    }
    static{                                //1 靜態代碼塊先執行
        System.out.println("x");
    }
    {                                    //2 對象的構造代碼塊。給對象初始化的。
        System.out.println("cc");
    }
    
    StaticCode2(int i){                    //3 被調用
        System.out.println("aa");
    }
    public static void show(){                //靜態方法,沒有調用。
        System.out.println("gogogo");
    }
}

public class StaticDemo4 {
    public static void main(String[] args) {
        new StaticCode2(4);                    
    }

}

輸出:

x
cc
aa

 

示例五

public class StaticDemo5 {
    static int i=1;
    static{                            
        System.out.println("a");        //第1步。a。且只執行一次
        i++;                            //i=i+1,結果2
    }    
    public StaticDemo5(){
        System.out.println("c");        //第2步。
        i++;                            //i=i+1,結果3
    }
    
    public static void main(String[] args) {
        StaticDemo5 t1=new StaticDemo5();
        System.out.println(t1.i);        //第3步。3
        
        StaticDemo5 t2=new StaticDemo5();    //第4步。c。第二次創建實例。static靜態代碼塊不執行。
        System.out.println(t2.i);        //第5步。又執行了一次StaticDemo5()構造函數。4
    }
}

輸出:

a
c
3
c
4

 創建第二個對象StaticDemo5 t2=new StaticDemo5()時,其實i已經先於對象存在於靜態區域


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM