多态性和动态绑定



假设我们有如下三个类

public class Woo extends Zoo {
    public String one() {
        return "wee" + this.two();
    }
    public String extra() {
        return "eek" + this.one();
    }
}
public class Zoo {
    public String one() {
        return "zee";
    }
public String two() {
        return "zow";
    }
}
public class Yoo extends Woo {
    public String two() {
        return "yow";
    }
}

假设变量声明为:

 Zoo z = new Yoo();

的输出是什么?
System.out.println(z.one() + " " + z.two() + " " + z.extra()); 

?

我的编译器不允许我编译

没有方法在动物园有额外的

但我认为,由于z的实际类型是Yoo类,并且由于Yoo继承了ZooWoo类的所有方法,z.extra()将工作....?

即使您为z分配了Yoo类型的值,它仍然是Zoo对象。因此,Java无法知道extra方法。您必须将z转换为YooWoo才能访问该方法。例如:

Zoo zoo = new Yoo();
Yoo yoo = (Yoo) zoo;
yoo.extra();

还是……

Zoo zoo = new Yoo();
Woo wyoo = (Woo) zoo;
wyoo.extra();

你甚至可以写

Zoo zoo = new Yoo();
((Woo) zoo).extra();

并省略一行。


此外,假设您要在Yoo类中重写extra。从上面的第二个示例调用wyoo.extra()将调用Yoo类的重写版本,因为Java不关心方法的内容,只关心方法是否存在。

如果您在调用extra之前将z的类型固定为Yoo或转换为Yoo(正如其他答案所描述的那样),您将能够编译,输出应该是

weeyow yow eekzee

相关内容

  • 没有找到相关文章

最新更新