java構造器執行順序一個有趣的簡單實例


 Animal為父類,構造器中調用public(default、protected) say方法,Dog繼承了Animal,並重載了say方法。新建Dog對象,查看運行結果,若將Animal中say方法改為private,再次運行程序查看結果:
public class Dog extends Animal {
    private String name;

    public Dog() {
        System.out.println("dog init");
        name = "jack";
    }

    public void say() {
        System.out.println("my name is:" + name);
    }

    public static void main(String[] args) {
        new Dog();
    }
}

class Animal {
    public Animal() {
        System.out.println("animal init");
        say();
    }

    // private
    public void say() {
        System.out.println("i am an animal..");
    }
}

  

運行結果1:


animal init
my name is:null
dog init


 若將Animal中的say方法改為private,運行結果2如下:


animal init
i am an animal..
dog init


 

 對於運行結果1執行順序:

  1. Dog構造器會首先默認調用父類Animal的構造器進行初始化,(同樣Animal繼續往上調用父類構造器)。
  2. Animal構造器調用say方法,由於子類Dog中重載了say方法,所以會調用子類中的say方法。
  3. 然后執行Dog構造方法中的部分。
  4. 對於運行結果2,因為private方法默認為final,在子類中是不可見的,所以無法重載,Dog中的say方法非繼承父類,所以新建Dog對象時Animal構造器方法仍然是調用他本身的final private void say 方法。

 

  總結
構造方法中應盡量避免調用其他方法,因為此時對象還沒有完全初始化,調用類的其他方法可能會遇到很多不可預知的錯誤。若迫不得已必須在構造器中調用,則應該將調用的方法設置為final方法
(或private,private方法編譯器也會默認加上final修飾符)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM