zoukankan      html  css  js  c++  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多态的两种常见用法中,方法重载使用的是静态分派机制,而方法重写使用的是静态分派机制。这也就导致了,方法重载调用的时候是根据变量的静态类型来决定调用哪个方法。而方法重写的时候,则是根据变量的实际类型来决定调用哪个方法。

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/zhenlingcn/p/8539065.html
Copyright © 2011-2022 走看看