Java 多态性与动态绑定
假设我们有三个类,如下所示Java 多态性与动态绑定,java,polymorphism,dynamic-binding,Java,Polymorphism,Dynamic Binding,假设我们有三个类,如下所示 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 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
的实际类型是classYoo
,并且Yoo
继承了Zoo
和Woo
类的所有方法,z.extra()
将起作用……。即使您为z指定了Yoo
类型的值,它仍然是Zoo
对象。因此,Java无法了解extra
方法。您必须将z转换为Yoo
或Woo
才能访问该方法。例如:
Zoo zoo = new Yoo();
Yoo yoo = (Yoo) zoo;
yoo.extra();
或者
你甚至可以
Zoo zoo = new Yoo();
((Woo) zoo).extra();
留下一行。
另外,假设您要在
Yoo
类中重写extra
。从上面的第二个示例调用wyoo.extra()
将从Yoo
类调用重写版本,因为Java不关心方法的内容,只要该方法是保证存在的。如果在调用extra
之前将z
的类型固定为Yoo
或强制转换为Yoo
(正如其他答案所描述的那样),您将能够编译,并且输出应该是
weeyow yow eekzee
在编译时,z的类型是Zoo,它没有“extra”方法。。
weeyow yow eekzee