java - java层次结构不明确

标签 java inheritance polymorphism

我的问题是为什么下面的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/

相关文章:

Java : Deploy restful web service without jersey

java - 尝试在空对象引用上调用虚拟方法 'int java.util.Random.nextInt(int)' [Android]

java - 为什么Java中的java.lang.Thread类没有被设计者标记为final?

c# - 创建基本用户控件

c# - 接口(interface)、继承和 'new' 关键字

haskell - 类型类约束、多态性和木薯管道

java - 我无法在 Vaadin 组件中调用 JpaRepository api

Java 编码——继承问题

c++ - 指向同一对象的不同基类型的指针和唯一指针

C++对象多态性问题