zoukankan      html  css  js  c++  java
  • Java静态分派和动态分派

    前言

    动态分派和静态分派机制是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方法。

    单分派与多分派

    静态分派是多分派的,动态分派是单分派的。
    多分派是指在静态分派的过程中需要考虑两步:
    1、判断静态类型是Father还是Son
    2、判断方法参数是Father还是Son
    综合上述两个因素(宗量),才能确定调用哪个方法。
    而动态分派由于使用的时候已经确定了参数类型,所以不需要对参数类型进行判断,只需要对变量类型进行判断即可。比如在上述例子中,我们已经通过静态分派,确定了调用的是无参的name方法,这时候我们就只需要考虑father的实际类型是Father还是Son即可。因此动态分派是单分派的。

    总结

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

     

    转自https://www.cnblogs.com/zhenlingcn/p/8539065.html

  • 相关阅读:
    MongoDB中_id(ObjectId)生成
    springMVC 拦截器源码解析
    初识设计模式(代理模式)
    vue VNode如何使用,是什么东西?
    AOP 怎么理解?
    Java集合框架——jdk 1.8 ArrayList 源码解析
    System.arraycopy 怎么使用的?
    Java集合框架——容器的快速报错机制 fail-fast 是什么?
    maven 如何依赖工程项目里面的 jar 包
    IDEA maven 项目如何上传到私服仓库
  • 原文地址:https://www.cnblogs.com/smilepup-hhr/p/11224960.html
Copyright © 2011-2022 走看看