前言

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

Java静态分派和动态分派的更多相关文章

  1. java中的静态分派和动态分派

    多态是java的基本特征之一,多态即一个对象具有多种形态(多种表达形式,猴子是动物的一种的表现形式),例如:子类是父类的一种形态. 当方法重载时,就会涉及到多态. 1:在重载时是通过参数的静态类型,而 ...

  2. 简单介绍Java的静态分派和动态分派

    最近复习JVM的知识,对于静态分派和动态分派的理解有点混乱,于是自己尝试写写代码,在分析中巩固知识. 有如下一段代码,请问每一段分别输出什么? package com.khlin.my.test; c ...

  3. java:java静态代理与动态代理简单分析

    java静态代理与动态代理简单分析 转载自:http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动 ...

  4. 转:【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17965867   方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法 ...

  5. 深入Java虚拟机:多态性实现机制——静态分派与动态分派

    方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩 ...

  6. 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派

    方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩 ...

  7. Java静态分派与动态分派(二)

    方法调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程. 在程序运行时,进行方法调用是最普遍.最频繁的操作,但是Class文件 ...

  8. 通过字节码分析Java方法的静态分派与动态分派机制

    在上一次[https://www.cnblogs.com/webor2006/p/9723289.html]中已经对Java方法的静态分派在字节码中的表现了,也就是方法重载其实是一种静态分派的体现,这 ...

  9. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

随机推荐

  1. SpringData :下划线的那些破事

    今天写一个查询语句的时候,报错如下 org.springframework.beans.factory.BeanCreationException: Error creating bean with ...

  2. win7“您可能没有权限使用网络资源”的解决办法

    删除“拒绝从网络访问这台计算机”里面的Gu   1 在屏幕的左下角点开[开始]----在搜索程序和文件那个文本框里输入[输入gpedit.msc]然后回车. 2 弹出如下图的对话框, 3 依次展开-- ...

  3. Windows和Linux下putenv()函数导致composer更新失败

    bug复现: 原因: putenv() 函数设置特定的环境变量有可能是一个潜在的安全漏洞,所以这个函数在php配置文件中是默认禁止的,在 php.ini 中查找此函数,然后将此函数删除掉,重载配置即可 ...

  4. (转)AutoML 与轻量模型大列表: awesome-AutoML-and-Lightweight-Models

    Awesome-AutoML-and-Lightweight-Models 原文:http://bbs.cvmart.net/articles/414/zi-yuan-automl-yu-qing-l ...

  5. flink 读JDQ和写JDQ的流程

    ReadFromJDQ3 1)消费JDQ的必要信息,通过参数传入,有6个参数 2)获取flink JDQ3的鉴权客户端 3)根据鉴权客户端获取消费属性的配置 4)构建应用环境ENV和checkpoin ...

  6. cv2.fillConvexPoly()与cv2.fillPoly()填充多边形

    cv2.fillConvexPoly() cv2.fillConvexPoly()函数可以用来填充凸多边形,只需要提供凸多边形的顶点即可. 我们来画一个三角形 img = np.zeros((1080 ...

  7. AndoridSQLite数据库开发基础教程(7)

    AndoridSQLite数据库开发基础教程(7) 为空表添加数据 开发者可以单击Data按钮,看到Students表中是没有数据的,创建好的Students表是一个空表.如图1.15所示.如果开发者 ...

  8. Flutter ListView 列表组件

    列表常见的情况: 1.垂直列表 2.垂直图文列表 3.横向列表 4.动态列表 名称 类型 说明 scrollDirection Axis Axis.horizontal 横向列表 Axis.verti ...

  9. Windows Vistual Studio 2013/2015 MRPT安装

    博客参考:https://blog.csdn.net/qyjzhou/article/details/80110941 MRPT 安装 1. 官网编译好的程序直接安装 https://sourcefo ...

  10. Navigator的使用:

    1.路由直接跳转到下一个页面: Navigator.pushNamed(context,"/login"); 2.跳转的下一个页面,替换当前的页面: Navigator.of(co ...