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

问题:

在测试类中创建一个多态 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基础学习总结——多态(动态绑定)(写的很好,值得看)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值