程序园程序员程序员技术栈

详解 JVM 字节码(7)重写

2019-05-04  本文已影响30人  zidea
jvm

方法的动态分派,不是编译器确定的是在程序运行期确定的。
方法的动态分派涉及到一个重要概念:方法接收者也就是方法具体是由哪个对象调用,多态是一种运行期的行为,这是由于invokevitural 指令的多态查找流程所决定的。

判断动态还是静态调用最好方法就是看方法接收者是否相同。
针对方法调用动态分派:在类的方法区会建议一个虚拟方法表的数据结构(virtual method table, vtable)
针对 invokeinterface 指令,JVM 会建立一个叫做接口方法表的数据结构(interface method table itable)

class Base {
    public void onStart(){
        System.out.println("onStart of Base");
    }
}
class Activity extends Base{
    @Override
    public void onStart() {
        System.out.println("onStart of Activity");
    }
}

class Fragment extends Base{
    @Override
    public void onStart() {
        System.out.println("onStart of Fragment");
    }
}
public class ClientC {
    public static void main(String[] args) {
        Base activity = new Activity();
        Base fragment = new Fragment();

        activity.onStart();
        fragment.onStart();

        activity = new Fragment();
        activity.onStart();
    }
}

输出

onStart of Activity
onStart of Fragment
onStart of Fragment
字节码
上一篇下一篇

猜你喜欢

热点阅读