首页 > 解决方案 > 为什么代码执行超类'方法而不是子类'?

问题描述

我在练习多态性和继承时偶然发现了一个我无法理解的解决方案

有以下简单的代码:

public class A{
    protected int _i;

    public A(int i){   
        _i = i;
    }

    public boolean equals (A other){
        System.out.print("A ");
        return ((other!=null) && (_i==other._i));
    }
}

public class B extends A{
    public B(int i){
        super(i+1);
    }

    public boolean equals (B other){
        System.out.print("B ");
        return ((other!=null) && (_i==other._i));
    }
}

public class C extends B{
    public C(int i){
        super(i);
    }

    public boolean equals (Object other){
        System.out.print("C ");
        return ((other!=null) && (other instanceof C) && (_i==((C) other)._i));
    }
}

//main:

public class DriverABCD{
    public static void main(String[] args){
        A a = new A(1);
        B b = new B(1);
        C c = new C(1);

        a=c;
        System.out.println (b.equals(a));  
    }
}

输出是 A 'A true'。问题是我不明白为什么。

据我了解a=c,使“a”成为对象 C 的引用(垃圾收集器删除对象 A)。

所以(b.equals(a))转到 B 类并执行 equals(B other),因为 C 扩展了 B。

我哪里错了?

标签: javainheritancepolymorphism

解决方案


忽略 的,并考虑如果您只知道所涉及的类型a,您会调用什么方法。bc

a是一个A并且b是一个B。你调用一个名为 a 的方法equalsB传入一个A. 与该调用最匹配的方法是public boolean equals (A other)in A


推荐阅读