虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员
--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键。
虚函数表
成员方法的解析
java中方法分派指令:
invokespecial
invokevirtual
invokedynamic
involveinterface
静态类型,静态分派
实际类型,动态分派
成员数据解析
根据 java7虚拟机规范 , 成员数据解析过程描述如下:
为了将一个还没有解析的符号引用D解析成一个类(或者接口)C的一个成员,符号引用C必须被先解析。因此任何因在C被解析成类(或者接口)时失败导致抛出的异常都可以被解析符号引用D时抛出。如果C可以被解析成一个类(或者接口),则因D被解析成一个成员引用失败抛出的异常才可以被抛出。
如果C声明了和D符号引用(名称和描述符)一样的成员引用,则解析成功;
否则,解析过程递归到类C的直接实现(或者接口C直接继承)的接口中;
否则,如果C有父类S,则解析过程递归到S中;
否则,解析失败。
纵使上面解析成功,接着还会验证访问权限:
如果上面的解析过程解析失败,则直接抛出 NoSuchFieldError;
否则,如果没有对D没有 获取权限 ,则直接抛出 IllegalAccessError;
从上面的解析过程可以看到,对于成员数据的访