我的问题是为什么下面的x.proc(z)
打印57而不是打印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 是合理的。
最佳答案
方法
public void proc(Z p) {System.out.println(39);}
在Z
中不会覆盖
public void proc(X p) {System.out.println(43);}
在 X
中,因为它将域限制为 Z
而不是 X
。
但是,Y
中的类似方法确实覆盖X
中的proc
。
由于x
的编译时类型是X
,因此唯一的方法签名
匹配 x.proc(z)
是 public void proc(X p)
。直到现在,动态调度才会发生,并且选择并执行来自 Y
的重写版本,这将导致输出“57”,如预期的那样。
关于java - java层次结构不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49309895/