我的问题是为什么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);}
in Z
不覆盖
public void proc(X p) {System.out.println(43);}
in X
因为它将域限制为Z
代替X
.
然而,类似的方法在Y
does覆盖proc
in X
.
由于编译时类型为x
is X
,唯一的方法签名
火柴x.proc(z)
是那个public void proc(X p)
。直到现在,动态调度才会发生,并且重写版本来自Y
选择并执行,结果如预期的那样输出“57”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)