Ambiguous java hierarchy(模糊的java层次结构)
问题描述
我的问题是为什么下面的 x.proc(z)
打印 57 而不是打印 39 ?
My question is why x.proc(z)
below does print 57 instead of printing 39 ?
class X
{
protected int v=0;
public X() {v+=10; System.out.println("constr X");}
public void proc(X p) {System.out.println(43);}
}
class Y extends X
{
public Y() {v+=5;System.out.println("constr Y");}
public void proc(X p) {System.out.println(57);}
public int getV() {return v;}
}
class Z extends Y
{
public Z() {v+=9;System.out.println("constr Z");}
public void proc(Z p) {System.out.println(39);}
}
class Main
{
public static void main(String argv[])
{
X x = new Z(); // v=24
Y y = new Z(); // v=24
Z z = new Z(); // v=24
x.proc(z); //57
}
}
X x
指的是一个 Z
对象,而类 Z
确实有方法 proc(Z p)
但它也有方法proc(X p)
.此外,参数 z
的类型为 Z
,因此打印 39 是合理的.
X x
refers to a Z
object, and class Z
does have the method proc(Z p)
but it also has the method proc(X p)
. Also the parameter z
is of type Z
so it would be reasonable to print 39.
推荐答案
方法
public void proc(Z p) {System.out.println(39);}
在 Z
中不覆盖
public void proc(X p) {System.out.println(43);}
在 X
中,因为它将域限制为 Z
而不是 X
.
in X
because it restricts the domain to Z
instead of X
.
然而,Y
中的类似方法确实覆盖了X
中的proc
.
However, the analogous method in Y
does override proc
in X
.
由于x
的编译时类型是X
,唯一的方法签名是匹配 x.proc(z)
是 public void proc(X p)
的.直到现在才进行动态调度,并且选择并执行来自 Y
的覆盖版本,结果如预期的那样输出57".
Since the compile time type of x
is X
, the only method signature that
matches x.proc(z)
is that of public void proc(X p)
. Only now does the dynamic dispatch take place, and the overriding version from Y
is selected and executed, which results in output "57", as expected.
这篇关于模糊的java层次结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:模糊的java层次结构
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01