开发者社区> hiekay> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 深入Java虚拟机:多态性实现机制--动态单分派和静态多分派
+关注继续查看

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

  • 术语: 宗量(JVM虚拟机) , 什么是宗量, 方法调用者和方法参数被称为宗量.(后面理解分派需要)
  • 静态类型: 一个对象在声明时的类型称为静态类型,静态类型再编译器编译时可知. 如 Animal a = new Dog(), 静态类型为Animal, 实际类型为Dog.

Java 静态分派(方法重载)

public class Test{
    //hi 方法重载
    public void hi(Father f , Father f1){
       System.out.println("ff");
    }

    public void hi(Father f , Son s){
      System.out.println("fs");
    }

    public void hi(Son s , Son s2){
      System.out.println("ss");
    }

    public void hi(Son s , Father f){
      System.out.println("sf");
    }

    public static void main(String[] rags){
       Father f = new Father();
       Father s = new Son();
       Test t = new Test();
       t.hi(f , new Father());
       t.hi(f , s);
       t.dost(s, f);
    }
}
class Father {}
class Son extends Father{}

执行结果没有像预期的那样输出 ff、fs、sf而是输出了三个 ff.

此处对于对象声明时,静态类型为Father, 所以在编译期间,编译器会根据参数的静态类型选择要执行的方法,此时已经确定要执行的方法,所以在运行时调用的方法为ff输出的方法.这就是静态分派.

Java 动态分派(方法重写)

public class Test{

    public static void main(String[] rags){
        Father f = new Father();
        Father s = new Son();
        System.out.println("f.i " +f.i);
        System.out.println("s.i " +s.i);
        f.hi();
        s.hi();
    }
}

class Father {
        int i = 0 ;
        public void hi(){
            System.out.println("WelcomeFather!");
        }

}

class Son extends Father{
    int i = 9 ;
    public void hi(){
        System.out.println("WelcomeSon!");
    }

}

运行结果:f.i 0 s.i 0 WeclomeFather! WeclomeSon!

变量f,s在编译器静态类型为Father,所以i来自于father, 在运行期间,JVM会根据实际类型来调用方法,s的实际类型为Son,所以调用的方法是Son重写的hi方法. 根据实际类型的方法调用为动态分派.

单分派&多分派

单分派和多分派取决于宗量,  方法调用者和方法参数都是宗量.

Java中静态分派的方法调用,首先确定调用者的静态类型是什么,然后根据要调用的方法参数的静态类型(声明类型)确定所有重载方法中要调用哪一个, 需要根据这两个宗量来编译, 所以是静态多分派(多个宗量确定).
Java中动态分派的方法调用,在运行期间,虚拟机会根据调用者的实际类型调用对应的方法, 秩序根据这一个宗量就可以确定要调用的方法,所以是动态单分派(一个宗量)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《深入理解Java虚拟机》读书笔记
《深入理解Java虚拟机》是整个Java图书领域公认的经典著作和超级畅销书,全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。本文就是读者对于本书阅读后的读书笔记,和大家一起分享。
3147 0
《深入理解Java虚拟机》学习笔记
第2章 垃圾收集器与内存分配策略 1.Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域, 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是在以来用户线程的启动和结束而建立和销毁。
4926 0
混合云HBR云上备份VMware虚拟机
本文主要介绍一种简单且具备成本效益的混合云下的备份解决方案,可以为任何位置的客户虚拟机和数据提供强有力的保护,包括企业数据中心、远程和分支机构以及云上资源。
1466 0
+关注
hiekay
java 数据分析 数据可视化 大数据
183
文章
90
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载