1. 程式人生 > >Java中靜態、非靜態程式碼塊, 無參、有參構造方法執行順序

Java中靜態、非靜態程式碼塊, 無參、有參構造方法執行順序

基本概念

1、靜態程式碼塊和非靜態程式碼塊:

相同點:都是JVM載入類時且在建構函式執行之前執行,在類中都可以定義多個,一般在程式碼塊中對一些static變數進行賦值。

不同點:靜態程式碼塊在非靜態程式碼塊之前執行。靜態程式碼塊只在第一次new時執行一次,之後不再執行。而非靜態程式碼塊每new一次就執行一次。

2、構造方法:
構造方法的方法名和類名相同;無返回值型別;可以指定引數;完成物件的初始化。
注意:子類繼承父類的時候會自動繼承父類預設的無參構造方法。而如果父類裡面已經有一個帶有引數的構造函數了,如果沒有寫那個預設的不帶引數的建構函式的話,繼承的時候子類就會報錯,因為系統不知道要繼承哪個建構函式,必須明確的使用super()關鍵字來描述。

程式碼例項

/**
* @ClassName: ExtendsDemo
* @Description:優先順序父類 > 子類;靜態程式碼塊 > 非靜態程式碼塊 > 建構函式。注意靜態程式碼塊若執行 僅執行一次
*/
public class ExtendsDemo {  

    public static void main(String[] args) {  
        demofather fa = new demoson(); //執行了無參構造方法 
        System.out.println("\n"+fa.getClass());
        fa = new
demoson("000000000"); } } class demofather { //靜態程式碼塊只在第一次new時執行一次,之後不再執行。而非靜態程式碼塊每new一次就執行一次。靜態程式碼塊 > 非靜態程式碼塊 static { System.out.print(" 父類的靜態程式碼塊 "); } { System.out.print(" 父類的非靜態程式碼塊 "); } //構造方法:完成物件的初始化 public demofather() { System.out.print
(" 父類無參構造 "); } //構造方法過載 public demofather(String a) { System.out.print(a); } } class demoson extends demofather { static { System.out.print(" 子類的靜態程式碼塊 "); } { System.out.print(" 子類的非靜態程式碼塊 "); } //構造方法:完成物件的初始化 public demoson() { System.out.print(" 子類無參構造 "); } //構造方法過載 public demoson(String b) { //這裡的super關鍵字 指明要呼叫的父類建構函式是什麼 super("11111111"); System.out.print(b); } }

列印結果
這裡寫圖片描述