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已經先於對象存在於靜態區域