This question already has answers here:
Polymorphism vs Overriding vs Overloading

(21个回答)


3年前关闭。



package package1;
public class MyClassA {
    protected int size;
    public MyClassA() {
    }
    protected int getAge() {
        return 10;
    }
    public int callAge() {
        return getAge();
    }
}

package package2;
import package1.MyClassA;
public class MyClassB extends MyClassA {
    protected int getAge() {
    return 20;
    }
    private int superesult() {
        return super.callAge();
    }
    public static void main(String args[]) {
        MyClassB classb = new MyClassB();
        System.out.println(classb.getAge());
        System.out.println(classb.superesult());
    }
}

当我调用getAge和superresult方法时,我期望输出20 10,但是代码正在打印2020。提前致谢。

最佳答案

简短答案:您调用callAge,因为它是在A中实现的。但是该方法调用了被重写的getAge(因此Java遵循在B中完成的实现)。

较长版本的:

您打电话的时候:

classb.superesult();

它将调用super.callAge(),这意味着将执行callAge()类的AcallAge()会调用getAge(),但由于该对象是B类的实例,并且 getAge()覆盖,因此它返回20

请注意,如果您调用super.foo(),则仅将称为超级foo super因此并不意味着您“更改上下文” :仍通过对对象的动态绑定来解析超级调用产生的所有调用(并且该对象仍然是B的实例)。可以重写foo的所有调用(除非将这些调用标记为final)。在大多数情况下,这是所需的行为。

09-26 09:26