在繼承當中這些方法及程式碼塊執行順序是什麼樣的

jxaa0965發表於2022-11-15

在Java中,尤其是我們的Java基礎中,我們會學習到我們的靜態程式碼塊,構造程式碼塊,區域性程式碼塊,也會學習到構造方法和不同方法,那麼這些執行順序是什麼樣呢,我們下面來一起看一看:
我們這裡需要建立兩個類,分別是Person(普通類),Demo(測試類)

Person(普通類)

public class Person {    static {
        System.out.println("靜態程式碼塊");
    }
    {
        System.out.println("構造程式碼塊");
    }    public Person (){
        System.out.println("構造方法");
    }    public void Common(){
        System.out.println("普通方法");
        {
            System.out.println("區域性程式碼塊");
        }
    }
}

Demo(測試類)

public class Demo {
    public static void main(String[] args) {
        /**
         * Person p = new Person();
         *   靜態程式碼塊
         *   構造程式碼塊
         *   構造方法
         * p.Common();
         *   普通方法
         *   區域性程式碼塊
         */
        Person p = new Person();
        p.Common();
        /**
         * 再這裡我們發現了一個問題,當我們第二次建立物件的時候我們的靜態程式碼塊沒有出現,那麼這個是為什麼呢?
         * 在這裡我們需要記住兩件事情:
         * 1)當我們第一次載入類的時候會執行我們的靜態程式碼塊,暫時可以理解為我們在第一次建立物件時會執行一次,之後不會再次執行
         * 2)我們的構造程式碼塊,時在每次new物件之前都會執行一次
         * Person p2 = new Person();
         *   構造程式碼塊
         *   構造方法
         * p2.Common();
         *   普通方法
         *   區域性程式碼塊
         */
        Person p2 = new Person();
        p2.Common();
    }
}

上述只是簡單的程式碼塊之前的順序,那麼在我們的繼承關係中他們的執行順序又是什麼樣的呢,下面我們再來測試以下:
我們這裡需要建立三個類,分別是Super(父類),Sub(子類),Demo(測試類)

Super(父類)

public class Super {    static {
        System.out.println("我是父類靜態程式碼塊");
    }
    {
        System.out.println("我是父類構造程式碼塊");
    }    public Super (){
        System.out.println("我是父類構造方法");
    }    public void Common(){
        System.out.println("我是父類普通方法");
        {
            System.out.println("我是父類區域性程式碼塊");
        }
    }    
}

Sub(子類)

public class Sub extends Super{    static {
        System.out.println("我是子類靜態程式碼塊");
    }
    {
        System.out.println("我是子類構造程式碼塊");
    }    public Sub (){
        System.out.println("我是子類構造方法");
    }    //重寫了父類的Common方法
    public void Common(){
        System.out.println("我是子類重寫後的普通方法");
        {
            System.out.println("我是子類重寫後的區域性程式碼塊");
        }
    }
}

Demo(測試類)

public class Demo {
    public static void main(String[] args) {
        /*每一段都是單獨的*/
        /**
         * Super s = new Super();
         *   我是父類靜態程式碼塊
         *   我是父類構造程式碼塊
         *   我是父類構造方法
         * s.Common();
         *   我是父類普通方法
         *   我是父類區域性程式碼塊
         */
        Super s = new Super();
        s.Common();
        /**
         * Sub a = new Sub();
         *   我是父類靜態程式碼塊
         *   我是子類靜態程式碼塊
         *   我是父類構造程式碼塊
         *   我是父類構造方法
         *   我是子類構造程式碼塊
         *   我是子類構造方法
         * a.Comm();
         *   我是子類普通方法
         *   我是子類區域性程式碼塊
         */


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70019613/viewspace-2923463/,如需轉載,請註明出處,否則將追究法律責任。

相關文章