類的Static代碼塊,也就是靜態(tài)代碼塊,只會執(zhí)行一次盟戏,是在類被加載的時候執(zhí)行。因為每個類只會被加載一次甥桂,所以靜態(tài)代碼塊也只會被執(zhí)行一次柿究。而構(gòu)造方法每次生成一個對象的時候都會調(diào)用類的構(gòu)造方法,所以new一次就會調(diào)用構(gòu)造方法一次黄选。
靜態(tài)代碼塊的作用也是完成一些初始化工作束昵。首先執(zhí)行靜態(tài)代碼塊疆瑰,然后執(zhí)行構(gòu)造方法被盈。靜態(tài)代碼塊在類被加載時候執(zhí)行炸枣,而構(gòu)造方法是在生成對象時候執(zhí)行;要想調(diào)用某個類來生成對象民镜,首先需要將類加載到Java虛擬機上(JVM),然后由JVM加載這個類來生成對象啡专。
如果繼承體系中既有構(gòu)造方法,又有靜態(tài)代碼塊制圈,那么首先執(zhí)行最頂層的類的靜態(tài)代碼塊们童,一直執(zhí)行到最底層的類的靜態(tài)代碼塊。然后再去執(zhí)行最頂層的類的構(gòu)造方法离唐,一直執(zhí)行到最底層的類的構(gòu)造方法病附。注意:靜態(tài)代碼塊只會執(zhí)行一次问窃。
不能在靜態(tài)方法中訪問非靜態(tài)成員變量亥鬓;可以在靜態(tài)方法中訪問靜態(tài)成員變量∮虮樱可以在非靜態(tài)方法中訪問靜態(tài)的成員變量嵌戈。不能在靜態(tài)方法中使用this關(guān)鍵字。
下面這段程序的執(zhí)行結(jié)果是:
liulongchangdeMacBook-Air:JavaClass liulongchang$ java FinalTest4 P static block Q static block S static block P constructor Q constructor S Static block P constructor Q constructor S Static block liulongchangdeMacBook-Air:JavaClass liulongchang$
程序代碼:
public class FinalTest4 { public static void main(String[] args) { new S(); new S(); } }
class P { static { System.out.println("P static block"); } public P() { System.out.println("P constructor"); } }
class Q extends P { static { System.out.println("Q static block"); } public Q(){ System.out.println("Q constructor"); } }
class S extends Q { static { System.out.println("S static block"); } public S() { System.out.println("S Static block"); } }
捎帶腳寫幾句final的注意點:
當final修飾一個原生數(shù)據(jù)類型時听皿,表示該原生數(shù)據(jù)類型的值不能發(fā)生變化熟呛;如果final修飾一個引用類型時,表示該引用類型不能再指向其他對象了尉姨,但該引用所指向的對象的內(nèi)容是可以發(fā)生變化的庵朝。
對于final類型成員變量 一般來說有兩種賦初值方式:
*****在聲明final類型的成員變量時就賦上初值
*****在聲明final類型的成員變量時不賦初值,但在類的所有構(gòu)造方法中都為其賦上初值又厉。