【问题标题】:Polymorphism and Dynamic Binding多态性和动态绑定
【发布时间】:2015-07-16 00:47:02
【问题描述】:

假设我们有如下三个类

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()); 

是吗?

我的编译器不允许我这样编译

Zoo 中没有任何方法有额外的

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

【问题讨论】:

  • 在编译时,z是Zoo类型的,它没有'extra'方法..

标签: java polymorphism dynamic-binding


【解决方案1】:

即使您为 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 不关心方法的内容,只是保证方法存在。

【讨论】:

    【解决方案2】:

    如果您在调用extra 之前将z 的类型固定为Yoo 或强制转换为Yoo(因为其他答案描述得很好),您将能够编译并且输出应该是

    weeyow yow eekzee
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多