美文网首页
方法的静态、动态分派

方法的静态、动态分派

作者: 快点给我想个名 | 来源:发表于2019-09-26 20:50 被阅读0次

栈帧是一种用于帮助虚拟机执行方法调用和方法执行的数据结构。
栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法的返回地址以及操作数栈等信息。

方法调用字节码指令
  • invokeinterface 调用接口中的方法,实际上是在运行期决定的,决定到底调用哪个实现该接口的对象的特定的方法。
  • invokestatis 调用静态方法
  • invokespecial 调用自己的私有方法、构造方法(<init>)以及调用父类的方法
  • invokevirtual 调用虚方法,运行期动态查找
  • invokedynamic 动态调用方法
  1. 静态方法
  2. 父类方法
  3. 构造方法
  4. 私有方法
    以上四类方法称为非虚方法,他们是在类加载阶段就可以将符号引用转换为直接引用
方法的静态分派
public class MyTest1 {

    public void test(Grandpa grandpa){
        System.out.println("Grandpa");
    }

    public void test(Father father){
        System.out.println("father");
    }

    public void test(Son son){
        System.out.println("son");
    }

    public static void main(String[] args) {
        Grandpa g1 = new Father();
        Grandpa g2 = new Son();
        MyTest1 test = new MyTest1();
        test.test(g1);
        test.test(g2);
    }
}

class Grandpa{ }
class Father extends Grandpa{ }
class Son extends Father{ }

上述代码输出

Grandpa
Grandpa

因为g1的静态类型是Grandpa,而g1的实际类型是Fatcher。所以变量的静态类型是不会发生变化的,而变量的实际类型则是可以发生变化的(多态的一种体现),实际类型是在运行期才能确定。并且方法的重载是一种静态行为。

方法的动态分派
public class MyTest2 {
    public static void main(String[] args) {
        Fruti apple = new Apple();
        Fruti orange = new Orange();
        apple.test();
        orange.test();
        apple = new Orange();
        apple.test();
    }
}

class Fruti{
    public void test(){
        System.out.println("fruit");
    }
}

class Apple extends Fruti{
    @Override
    public void test() {
        System.out.println("Apple");
    }
}

class Orange extends Fruti{
    @Override
    public void test() {
        System.out.println("Orange");
    }
}

上述代码输出

Apple
Orange
Orange

方法的动态分派涉及到一个重要的概念:方法的接收者

相关文章

  • Java静态分派、动态分派、双重分派

    动态分派和静态分派机制是java多态的实现原理。 静态分派(方法重载) 静态分派机制最典型的代码: 这段代码执行完...

  • Java方法分派

    静态分派 - 方法重载分派编译期确定根据调用者的声明类型和方法参数类型分派 动态分派 - 方法重写分派运行时确定根...

  • java虚拟机之方法调用(下)——单分派与多分派

    前言 上一篇讲解了静态分派和动态分派,还不清楚的同学可以先看看:java虚拟机之方法调用(上)——静态分派与动态分...

  • Java 分派

    静态分派 重载属于静态分派 靠静态类型来判断 如上代码中输出为: 动态分派 重写属于动态分派 靠实际类型来判断 如...

  • 方法的静态、动态分派

    栈帧是一种用于帮助虚拟机执行方法调用和方法执行的数据结构。栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接...

  • 多态->分派

    摘抄深入理解java虚拟机目标 分派包括: 静态分派与动态分派两种类型, 静态分派的使用场景为重载, 动态分派使用...

  • (JVM)Java虚拟机:静态分派 & 动态分派 原理解

    前言 了解 行为方法分派 有利于在行为分派时时进行一些功能操作 本文全面讲解行为分派的类型:静态 & 动态行为分派...

  • Swift中的VTable简述

    在Swift中方法的调度分为静态方法直接调用与动态分派两种方式 静态方法静态方法表示其为不可变的,为了提高调用的效...

  • Java 静态多分派&动态单分派

    分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派。 编译期是根据对象声明的类型来选择方法,运行...

  • 深入Java虚拟机:多态性实现机制--动态单分派和静态多分派

    分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派。编译期是根据对象声明的类型来选择方法,运行期...

网友评论

      本文标题:方法的静态、动态分派

      本文链接:https://www.haomeiwen.com/subject/uzxvyctx.html