动态绑定调用哪个函数?

时间:2015-01-21 13:59:04

标签: java dynamic override

a.x的价值是多少?

我认为动态绑定会选择超类中的g()函数,因为调用了super.f()。或者我错了,动态绑定调用g()的覆盖函数,结果变为27?如果是这样,为什么?

dynamic binding exercise

2 个答案:

答案 0 :(得分:1)

我修改了您的代码以追踪正在发生的事情:

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()方法的原因。

答案 1 :(得分:0)

java中的所有实例方法都是虚拟的,因此调用B.g()并且答案为27