为什么这个代码打印20 20而不是20 10?

Pho*_*gar 3 java core

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调用getAge和superresult方法时,我期待20 10作为输出,但代码打印20 20.感谢提前.

Wil*_*sem 5

简短的回答:你打电话给callAge它实现A.但是该方法调用getAge被覆盖的内容(因此Java遵循实现方式B).

更长的版本:

你打电话的时候:

classb.superesult();
Run Code Online (Sandbox Code Playgroud)

它将调用super.callAge(),这意味着callAge()A的执行.callAge()在他的部分所调用getAge(),但因为对象是类的实例BgetAge()被覆盖,则返回20.

请注意,如果你打电话给super.foo()你只打电话给超级foo.super因此并不意味着你"改变上下文":超级调用产生的所有调用仍然通过对象的动态绑定来解决(并且对象仍然是一个实例B).foo可以覆盖所有呼叫(除非标记了这些呼叫final).在大多数情况下,这是理想的行为.