靜態(tài)代碼塊
static { }
非靜態(tài)代碼塊
{ }
靜態(tài)代碼塊和非靜態(tài)代碼塊的異同點(diǎn)如下:
相同點(diǎn):都是JVM加載類時(shí)且在構(gòu)造函數(shù)執(zhí)行之前執(zhí)行,在類中都可以定義多個(gè),一般在代碼塊中對(duì)一些static變量進(jìn)行賦值。 不同點(diǎn):靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊 > 非靜態(tài)代碼塊)。靜態(tài)代碼塊只在第一次new時(shí)執(zhí)行一次,之后不再執(zhí)行。而非靜態(tài)代碼塊每new一次就執(zhí)行一次。
創(chuàng)建Son類,寫入 靜態(tài)代碼塊和非靜態(tài)代碼塊
public class Son extends Parent{ static { System.out.測(cè)試Test類public class Test { public static void main(String[] args) { Son son = new Son(); System.out.println("*****"); Son sons = new Son(); System.out.println("*****"); }}結(jié)果
子類繼承父類的時(shí)候會(huì)自動(dòng)繼承父類的默認(rèn)構(gòu)造函數(shù)(也就是繼承那個(gè)無參數(shù)的構(gòu)造函數(shù))。而如果類里面已經(jīng)有一個(gè)帶有參數(shù)的構(gòu)造函數(shù)了,如果沒有寫那個(gè)默認(rèn)的不帶參數(shù)的構(gòu)造函數(shù)的話,繼承的時(shí)候子類就會(huì)報(bào)錯(cuò),因?yàn)橄到y(tǒng)不知道要不繼承哪個(gè)構(gòu)造函數(shù),必須明確的使用super()關(guān)鍵字來描述。所以我們一般為了避免這種錯(cuò)誤的發(fā)生,在有帶有多個(gè)構(gòu)造函數(shù)的類里面都會(huì)寫一個(gè)不帶參數(shù)的構(gòu)造函數(shù)。
注:如果類無子類,則無需寫無參的構(gòu)造函數(shù)
父類
public class Parent { public Parent(){ System.out.println("父類的無參"); } public Parent(String a){ System.out.println("父類的有參"); } static { System.out.println("父類的靜態(tài)代碼塊"); } { System.out.println("父類的非靜態(tài)代碼塊"); }}子類
public Son(){ System.out.println("子類的無參"); } public Son(String A){ System.out.println("子類的有參"); } static { System.out.println("子類的靜態(tài)代碼塊"); } { System.out.println("子類的非靜態(tài)代碼塊"); }測(cè)試類
public class Test { public static void main(String[] args) { Son son = new Son(); System.out.println("*****"); Son sons = new Son("yy"); System.out.println("*****"); }}結(jié)果
說明: 靜態(tài)代碼塊是在類加載時(shí)自動(dòng)執(zhí)行的,非靜態(tài)代碼塊在創(chuàng)建對(duì)象自動(dòng)執(zhí)行的代碼,不創(chuàng)建對(duì)象不執(zhí)行該類的非靜態(tài)代碼塊。 順序: 靜態(tài)代碼塊 –>非靜態(tài)代碼塊 –>類構(gòu)造函數(shù)。
執(zhí)行順序: 父類的靜態(tài)代碼塊–>子類的靜態(tài)代碼塊 –>父類的非靜態(tài)代碼塊 –>父類的無參–>子類的非靜態(tài)代碼塊–>子類的無參
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注