美文网首页jvm&java basic
Java静态分派、动态分派、双重分派

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

作者: hadoop_a9bb | 来源:发表于2020-03-14 23:49 被阅读0次

动态分派和静态分派机制是java多态的实现原理。


静态分派(方法重载)

静态分派机制最典型的代码:

void test() {
        Father father = new Son();          //静态分派
        print(father);
    }

    void print(Father father) {
        System.out.println("this is father");
    }

    void print(Son son) {
        System.out.println("this is son");
    }

这段代码执行完会输出this is father.之所以是这个结果,原因是此处的多态是静态分派。对于方法的重载。在编译阶段由于father变量被声明为Father类型。在编一阶段就已经确定了调用的是参数为Father的方法,与具体的实例化对象无关。


动态分派

动态分派机制最典型的代码:

void test() {
        Father father = new Son();          //静态分派
        father.name();      //动态分派
    }

    class Son extends Father {
        void name(){
            System.out.println("son");
        }
    }

    class Father {
        void name(){
            System.out.println("father");
        }
    }

这里我们声明了静态类型Father,但是实际上我们调用name方法的时候,输出的却是son。对于方法的重写,java采用的是动态分派的机制。也就是说在运行时才确定调用那个方法。由于father的实际类型是Son,因此会调用Son的name方法。


动态分派只会体现在方法的调用者身上,而方法的参数类型则会在编译器由编译器确定。

示意图

在Java多态的两种常见用法中,方法重载使用的是静态分派机制,而方法重写使用的是静态分派机制。这也就导致了,方法重载调用的时候是根据变量的静态类型来决定调用哪个方法。而方法重写的时候,则是根据变量的实际类型来决定调用哪个方法


双重分派

如果参数类型(静态分派的类型)能够在运行期绑定,那么具体调用的是哪个方法就可以由方法参数和方法调用者共同决定。
既然方法的调用者类型是运行期才确定的,那么我们使方法的参数也在运行期去确定就可以控制具体调用哪个方法了。
那么如何才能将方法参数在运行期确定呢?
使用this就能运行期确定参数类型

accept(Father arg) {
        arg.print(this);
}

至此,就是双重分派的含义。哪个print被调用最终经过两次动态分派才被确定下来。
arg.print方法 这是一次动态分派。
而this 也是运行期确定下来的,这是第二次动态分派。

说完了双重分派 我们在说到visitor模式上,visitor模式的核心就是双重分派。此时print方法就变成了跨对象的操作方法。(任何Father的子类都会被识别出来)

相关文章

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

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

  • 多态->分派

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

  • Java 分派

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

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

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

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

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

  • Java方法分派

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

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

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

  • Java中的静态分派和动态分派

    静态分派 有如下代码: 在客户端定义了几个方法并调用如下: 输入结果为: 静态分派:对应Java语言的重载(Ove...

  • Java中的静态分派与动态分派

    本文是《深入理解Java虚拟机》8.3.2节的读书笔记,理解有误的地方,欢迎指正 首先是两个概念: 静态类型,即是...

  • 方法调用的编译和运行:static dispatch和dynam

    背景 静态分派(static dispatch)和动态分派(dynamic dispatch)是用来处理编程语言语...

网友评论

    本文标题:Java静态分派、动态分派、双重分派

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