Dec 31, 2010

动态绑定,Java super

Java中默认动态绑定,除 static, final, private 方法以及 super关键词调用的方法外。
动态绑定的实现(参考 Thinking in C++ 动态绑定的方法,不一定是Java的实现方法):每一个类具有一个 VTABLE,里面包含了动态函数的地址,并且这个表里面,子类和父类的函数地址的顺序是固定的,如果子类没有重定义函数,则函数地址为父类相应的函数地址。
每一个对象包含一个 vptr 指针,指向这个 VTABLE。

调用函数的过程,通过vptr找到 VTABLE,再找到函数地址。也就是调用函数,关键的是对象包含的 vptr,而不是引用的类名。引用的类名可以变化,而调用函数不变。如此可以实现多态。

super 是静态绑定
super 实现方式是直接找到父类的相应函数。suepr.f() 静态绑定父类的 f() 函数,但是注意 f() 函数调用的函数,还是要使用动态绑定。

class Parent
{
 public int getAInt() {
  return 10;
 }
 public int f() {
  return getAInt();
 }
}
class Child extends Parent
{
 public int getAInt() {
  return 5;
 }
 public int g() {
  return super.f();
 }
 public static void main(String [] argv) {
  Child t=new Child();
  System.out.println(t.g());
 }
}


输出
5

0 comments: