动态绑定调用哪个函数?

Which function does dynamic binding call?

a.x 的值是多少?

我认为动态绑定选择超类中的 g() 函数是因为 super.f() 被调用了。还是我错了,动态绑定是否调用了 g() 的覆盖函数,所以结果变成了 27?如果是,为什么?

java中的所有实例方法都是虚拟的,所以调用了B.g(),答案是27

我已经修改了您的代码以跟踪发生了什么:

public class A {
    public void f() { System.out.println("A.f");x = x + 4; g();System.out.println(this); }
    public void g() { System.out.println("A.g");x = x + 10;}
    public int x = 5;
    }


public class B extends A {
    @Override public void f() { System.out.println("B.f");x = x + 3; super.f(); }
    @Override public void g() { System.out.println("B.g");x = x + 15; }
}   

输出为:

B.f
A.f
B.g
com.sandbox.Main$B@18fb53f6
27

当从A调用g()时,可以看到this实际上是一个B对象,这就是调用B的g()方法的原因。