https://blog.csdn.net/zhuoaiyiran/article/details/19489745
1.如果父類構造器調用了被子類重寫的方法,且通過子類構造函數創建子類對象,調用了這個父類構造器(無論顯示還是隱式),就會導致父類在構造時實際上調用的是子類覆蓋的方法(你需要了解java繼承中的初始化機制)。
例子:
public abstract class Father { public Father() { display(); } public void display() { System.out.println("Father's display"); } }
public class Son extends Father { public Son() { } public void display() { System.out.println("Son's display"); } public static void main(String[] args) { new Son(); } }
輸出為:Son's display
這種機制有優點,不過有時也存在問題。
優點:通過繼承相同的父類,初始化子類時,父類會調用不同子類的不同復寫方法,從而實現多態性。
缺點:如果在父類構造函數中調用被子類重寫的方法,會導致子類重寫的方法在子類構造器的所有代碼之前執行,從而導致子類重寫的方法訪問不到子類實例變量的值,因為此時這些變量還沒有被初始化。