Java父类调用被子类重写的方法

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
 
这种机制有优点,不过有时也存在问题。
优点:通过继承相同的父类,初始化子类时,父类会调用不同子类的不同复写方法,从而实现多态性。
缺点:如果在父类构造函数中调用被子类重写的方法,会导致子类重写的方法在子类构造器的所有代码之前执行,从而导致子类重写的方法访问不到子类实例变量的值,因为此时这些变量还没有被初始化。
posted on 2018-08-16 16:25  旺仔牛轧糖  阅读(9071)  评论(0编辑  收藏  举报