2 w574240966 w574240966 于 2015.05.26 18:39 提问

JVM 中多态方法调用问题
     很多人说对象有 指向方法区的指针。(应该说的是对象头部的Markword中有指向这对象的Class指针)但是如果子类继承一个父类 比如 Father f = new Son(), 这个引用是怎么找到 父类中方法信息的。难道Markword中还有指向 父类class的指针? 

    我知道  JVM 最终会把 符号引用解析为直接引用,就是想找到,这个 找到方法的直接引用是存在哪里的?

3个回答

caozhy
caozhy   Ds   Rxr 2015.05.26 19:02

不是,通俗地说,派生类其实是在基类的类型上加上派生类的代码合成的一个类型,因此和基类浑然一体了,不存在什么派生类再指向基类。

qq_27361099
qq_27361099   2015.05.26 22:43

a声明为类型A是方便编译器能够编译时检查a是否可以调用test()方法,在实际运行时JVM记录a的实际类型是B;
在JVM中,B有一张方法表(分为多行),每一行的内容是方法名和指向方法实现的指针;如果是继承自A、而没有自己实现的方法,则可以将指针直接指到A的相关的方法实现;
在运行时,找到B的的方法表,顺着test()方法的指针找到方法实现,对a执行就可以了。

danielinbiti
danielinbiti   Ds   Rxr 2015.05.26 22:45

子类继承父类的情况,在JVM加载载入父类和子类后,会在方法区构建自己的方法表,也就是有一个父类方法表,一个子类方法表。
子类方法表的构建是父类的方法-子类的方法,假设父类有方法A,子类覆盖了方法A。
对于父类方法表类似
Object的方法
父类方法A的方法//这里只是突出一下,并不是说覆盖的方法排在第一个,实际这个方法的位置是固定的。
父类的其他方法

子类方法表类似
Object的方法
父类方法A的方法 //对于子类来说,这个位置还是原来父类方法A的位置,但这方法的执行时子类方法A
子类的其他方法

所以Father f = new Son(),调用f.A() 因为虽然是Father,但实际是Son,也就在Son的方法表中查找方法。然后又是Father调用,查找父类方法A的位置,这个位置在Son中是指向Son的方法A。就执行了子类的方法。

关键理解方法表、方法表中的偏移量、以及子类多态后相同方法的偏移量是与父类保持不变的。

Csdn user default icon
上传中...
上传图片
插入图片