动态绑定调用哪个函数?
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()方法的原因。
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()方法的原因。