假设我们有三个课程如下
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
继承了Zoo
和Woo
类的所有方法, z.extra()
会起作用吗?
答案 0 :(得分:2)
即使您为z指定了python
类型的值,它仍然是Yoo
个对象。因此,Java无法知道Zoo
方法。您必须将z转换为extra
或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();
课程中的extra
。从上面的第二个示例调用Yoo
将调用wyoo.extra()
类中的重写版本,因为Java并不关心方法的内容,只是保证方法存在。< p>
答案 1 :(得分:0)
如果您在调用z
之前将Yoo
的类型修改为Yoo
或投放到extra
(正如其他答案描述的那样),您将能够编译,输出应该是
weeyow yow eekzee