靜態代碼塊
static { }
非靜態代碼塊
{ }
靜態代碼塊和非靜態代碼塊的異同點如下:
相同點:都是JVM加載類時且在構造函數執行之前執行,在類中都可以定義多個,一般在代碼塊中對一些static變量進行賦值。 不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊 > 非靜態代碼塊)。靜態代碼塊只在第一次new時執行一次,之后不再執行。而非靜態代碼塊每new一次就執行一次。
創建Son類,寫入 靜態代碼塊和非靜態代碼塊
public class Son extends Parent{ static { System.out.測試Test類public class Test { public static void main(String[] args) { Son son = new Son(); System.out.println("*****"); Son sons = new Son(); System.out.println("*****"); }}結果
子類繼承父類的時候會自動繼承父類的默認構造函數(也就是繼承那個無參數的構造函數)。而如果類里面已經有一個帶有參數的構造函數了,如果沒有寫那個默認的不帶參數的構造函數的話,繼承的時候子類就會報錯,因為系統不知道要不繼承哪個構造函數,必須明確的使用super()關鍵字來描述。所以我們一般為了避免這種錯誤的發生,在有帶有多個構造函數的類里面都會寫一個不帶參數的構造函數。
注:如果類無子類,則無需寫無參的構造函數
父類
public class Parent { public Parent(){ System.out.println("父類的無參"); } public Parent(String a){ System.out.println("父類的有參"); } static { System.out.println("父類的靜態代碼塊"); } { System.out.println("父類的非靜態代碼塊"); }}子類
public Son(){ System.out.println("子類的無參"); } public Son(String A){ System.out.println("子類的有參"); } static { System.out.println("子類的靜態代碼塊"); } { System.out.println("子類的非靜態代碼塊"); }測試類
public class Test { public static void main(String[] args) { Son son = new Son(); System.out.println("*****"); Son sons = new Son("yy"); System.out.println("*****"); }}結果
說明: 靜態代碼塊是在類加載時自動執行的,非靜態代碼塊在創建對象自動執行的代碼,不創建對象不執行該類的非靜態代碼塊。 順序: 靜態代碼塊 –>非靜態代碼塊 –>類構造函數。
執行順序: 父類的靜態代碼塊–>子類的靜態代碼塊 –>父類的非靜態代碼塊 –>父類的無參–>子類的非靜態代碼塊–>子類的無參
新聞熱點
疑難解答