一 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執行順序:
- Dog構造器會首先默認調用父類Animal的構造器進行初始化,(同樣Animal繼續往上調用父類構造器)。
- Animal構造器調用say方法,由於子類Dog中重載了say方法,所以會調用子類中的say方法。
- 然后執行Dog構造方法中的部分。
- 對於運行結果2,因為private方法默認為final,在子類中是不可見的,所以無法重載,Dog中的say方法非繼承父類,所以新建Dog對象時Animal構造器方法仍然是調用他本身的final private void say 方法。
二 總結
構造方法中應盡量避免調用其他方法,因為此時對象還沒有完全初始化,調用類的其他方法可能會遇到很多不可預知的錯誤。若迫不得已必須在構造器中調用,則應該將調用的方法設置為final方法
(或private,private方法編譯器也會默認加上final修飾符)。