欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

53-通过字节码分析Java方法的静态分派与动态分派机制

程序员文章站 2024-03-16 23:13:46
...

通过字节码分析Java方法的静态分派与动态分派机制

  • 方法的动态分派:

    • 方法的动态分派涉及到一个重要的概念:方法接受者。
    • 多态,运行期的行为,涉及到invokevirtual字节码指令的多态查找流程:
      • 首先,到操作数的栈顶,去寻找到栈顶的元素所指向的这个对象的实际类型;
      • 第二步:如果在上面的过程当中寻找到了与常量池当中的“这个描述符“[下面这段]
     invokevirtual #6 <jvm/bytecode/Fruit.test>
    

    和名称相同的这个方法,并且也具备一些相应的访问权限,那么,它就直接的返回这个目标方法的直接引用。

    • 第三步:如果找不到,就按照继承的这种层次关系,从子类往父类,依次对他的各个父类重复的进行这种查找的流程,一直到真正的能够符合①②步要求的特定的对象的方法,然后去执行
    • 如果上面的三步找不到,那就抛异常吧!
  • 比较方法重载(overload)与方法重写(overwrite):可以得到下面的结论

    • 方法重载是静态的,是编译器行为;方法重写是动态的,是运行期行为。
    • 所以,Java中多态和方法重载并没有什么直接关系,相反,它和方法重写有着密不可分的关系。
public class MyTest6 {
    public static void main(String[] args) {
        Fruit apple = new Apple();
        Fruit orange = new Orange();

        apple.test();
        orange.test();

        apple = new Orange();
        apple.test();
    }
}
class Fruit{
    public void test(){
        System.out.println("Fruit");
    }
}
class Apple extends Fruit{
    @Override
    public void test(){
        System.out.println("Apple");
    }
}
class Orange extends Fruit{
    @Override
    public void test(){
        System.out.println("Orange");
    }
}
运行结果:
   Apple
   Orange
   Orange

反编译指令集:
53-通过字节码分析Java方法的静态分派与动态分派机制

相关标签: JVM