Java中默认动态绑定,除 static, final, private 方法以及 super关键词调用的方法外。
动态绑定的实现(参考 Thinking in C++ 动态绑定的方法,不一定是Java的实现方法):每一个类具有一个 VTABLE,里面包含了动态函数的地址,并且这个表里面,子类和父类的函数地址的顺序是固定的,如果子类没有重定义函数,则函数地址为父类相应的函数地址。
每一个对象包含一个 vptr 指针,指向这个 VTABLE。
调用函数的过程,通过vptr找到 VTABLE,再找到函数地址。也就是调用函数,关键的是对象包含的 vptr,而不是引用的类名。引用的类名可以变化,而调用函数不变。如此可以实现多态。
super 是静态绑定
super 实现方式是直接找到父类的相应函数。suepr.f() 静态绑定父类的 f() 函数,但是注意 f() 函数调用的函数,还是要使用动态绑定。
输出
5
动态绑定的实现(参考 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:
Post a Comment