模糊的java层次结构

2022-01-24 00:00:00 inheritance polymorphism 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.

相关文章