a.x
的价值是多少?
我认为动态绑定会选择超类中的g()
函数,因为调用了super.f()
。或者我错了,动态绑定调用g()
的覆盖函数,结果变为27?如果是这样,为什么?
答案 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
。