动态绑定规则
当对象o的一个方法可能被自类重写时,如果编译器不能确定o的运行时类型,那么必须对该方法进行动态绑定
将一个java语言的类翻译成c语言的程序段,主要的工作由如下几点(由继承引出的问题暂不考虑)
- 将Java语言中一个类的所有非静态属性构成一个C语言的结构体类型,取类的名字作为结构体类型的名字
- 类的静态属性是该类的所有对象所共有的,应当翻译成C中的全局变量,但是需要改一个名字。
- Java语言中类的对象声明不加翻译就成了C语言中的结构体类型
- 将java语言中的类的非静态方法翻译成C语言的函数,对应的方法和函数的区别由下面几点:
- 函数的名字必须在原来方法名的基础上修改
- 函数声明增加一个形参this
- 在函数体中出现的函数调用也要增加一个实参
- 在方法中对本对象的非静态属性的访问,改成对this相应域的访问。在方法中对其他对象的非静态属性的访问不必修改
- 类的静态方法在定义和调用的地方都需要改名
编译器怎么样有效地实现动态绑定?
- 编译器为每个类建立一个方法表,它们包含该类或它的超类中所有接口方法;
- 每个对象在C程序中由对应的结构体,再为这种结构体增加一个域,该域是方法表的指针
- 继承类方法表的产生
- 首先拷贝基类的方法,被重新定义的方法由新的定义覆盖
- 然后把新引入的方法追加打这张表上