在多态的情况下,在父类的构造器中运行子类的重写方法问题

问题:

在测试类中创建一个多态 Base b2 = new Sub();

结果在父类的构造器方法中调用的method重写方法,调用的却是子类的,这是为什么?

看以下代码:

public class Test01 {
    public static void main(String[] args) {
        /*
        1.new 的是父类对象,走父类构造
        直接调用了父类的method
        输出 base:100
        */
        Base b1 = new Base();
        /*
        2.多态new对象  new了子类对象 执行子类无参时先走父类无参构造
        此时父类中无参构造调用的method为重写后的method,然后传了一个100
        所以先输出 sub:100

        然后再执行super.method(70)调用父类method,并传递70
        所以输出 base:70
        */
        Base b2 = new Sub();
        System.out.println(b2.getClass());
    }
}
public class Sub extends Base{
    Sub() {super.method(70);
    }

    public void method(int j) {
        System.out.println("sub : " + j);
    }
}
public class Base {
    Base() {
        method(100);
    }

    public void method(int i) {
        System.out.println("base : " + i);
    }
}

以上方法执行的顺序是:

1、base : 100
2、sub : 100
3、base : 70
4、class Sub

在父类的构造器中跳转的方法是子类的是因为,new的运行类型是Sub(),所以执行的方法就是Sub类中的方法。

多态运行的方法只和=左边的运行类型有关,也就是你new的谁就去调谁的方法

如果new的对象中没有,由于有继承关系就会去父类中寻找,这其实是属于多态的动态绑定机制

并且调用不了父类中的 private属性变量和方法

还可以借鉴一下别人的文章

Java 父类构造函数中调用子类重写的方法

java基础学习总结——多态(动态绑定)(写的很好,值得看)

原文地址:https://www.cnblogs.com/MoonASixpence/p/14842604.html