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