此外,假设您要在
假设我们有如下三个类
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
继承了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 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