我有类似的设置:

public class Base {
    public String getApple() {return "base apple"};
}

public class Extended extends Base{
    public String getApple() {return "extended apple"};
}


我在代码中的其他地方有这个:

{
    Base b = info.getForm();

    if (b instanceof Extended){
        b = (Extended) b;
    }

    System.out.println(b.getApple()); // returns "base apple" even when if clause is true why??

}


我该怎么做?

最佳答案

第一:

if (b instanceof Extended){
    b = (Extended) b;
}


什么也没做。您基本上是说b = b,什么也没说。您甚至都没有更改参考。

其次,getApple()将始终是动态绑定的,并且应始终调用“扩展的苹果”-假定子类确实是对基类的扩展,并且方法是真正的重写。

基本上,您需要执行以下操作才能完成正确的getApple()行为:


删除if子句。它什么也没做。
确保您的课程确实在扩展基础课程
确保getApple()方法将覆盖基类方法。 (如果不确定,请使用@override批注)

10-05 20:58