静态类型/静态分派/动态分派/单分派/多分派

文章目录

  • 静态类型/实际类型
  • 方法解析
  • 静态分派
  • 动态单分派
  • 参考

静态类型/实际类型

Human woman = new Woman(); // Human就是静态类型,其实就是变量编译时类型,Woman就是实际类型
Man man = new Man(); // 静态类型和实际类型都是Man

方法解析

Class 文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在 Class 文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性给 Java 带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。这在前面的“Java 内存区域与内存溢出”一文中有提到。

静态解析成立的前提是:方法在程序真正执行前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。换句话说,调用目标在编译器进行编译时就必须确定下来,这类方法的调用称为解析。

在 Java 语言中,符合“编译器可知,运行期不可变”这个要求的方法主要有静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法都不可能通过继承或别的方式重写出其他的版本,因此它们都适合在类加载阶段进行解析。

Java 虚拟机里共提供了四个方法调用指令:

invokestatic:调用静态方法。
invokespecial:调用实例构造器方法、私有方法和父类方法。
invokevirtual:调用所有的虚方法。
invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。

只要能被 invokestatic 和 invokespecial 指令调用的方法,都可以在解析阶段确定唯一的调用版本,符合这个条件的有静态方法、私有方法、实例构造器和父类方法四类,它们在类加载时就会把符号引用解析为该方法的直接引用。这些方法可以称为非虚方法(还包括 final 方法),与之相反,其他方法就称为虚方法(final 方法除外)。这里要特别说明下 final 方法,虽然调用 final 方法使用的是 invokevirtual 指令,但是由于它无法覆盖,没有其他版本,所以也无需对方发接收者进行多态选择。Java 语言规范中明确说明了 final 方法是一种非虚方法。

解析调用一定是个静态过程,在编译期间就完全确定,在类加载的解析阶段就会把涉及的符号引用转化为可确定的直接引用,不会延迟到运行期再去完成。而分派调用则可能是静态的也可能是动态的,根据分派依据的宗量数(方法的调用者和方法的参数统称为方法的宗量)又可分为单分派和多分派。两类分派方式两两组合便构成了静态单分派、静态多分派、动态单分派、动态多分派四种分派情况。

静态分派

依赖静态类型来确定被调用的目标方法的分派过程称为静态分派。静态分派的典型应用就是方法重载。
调用重载的方法使用静态分派。

动态单分派

调用重写的方法使用动态分派
在运行期根据实际类型来确定被调用的目标方法的分派过程称为动态分派。

参考

1.https://www.zhihu.com/question/537174884
2.https://blog.csdn.net/sunxianghuang/article/details/52280002?utm_source=copy
3.https://wenku.baidu.com/view/a45d383451d380eb6294dd88d0d233d4b14e3f0c.html
4.https://blog.csdn.net/ns_code/article/details/17965867
5.http://www.javashuo.com/article/p-dwxxsokz-ky.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm回收垃圾_没有垃圾回收的JVM

jvm回收垃圾JVM社区不断增加新的GC,最近又添加了一个新的GC,它被称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途&…

C打印函数printf的一种实现原理简要分析

【0】README 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用;0.2) vsprintf 和 printf.c 的源码,参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309 【1】pr…

wireshark提取流量包中的文件_[技术]Wireshark抓取的数据包提取文件

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统:Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具,需要自己安装安装命令:sudo apt install tcpxtract使用方法…

java设计模式适配器模式_Java中的适配器设计模式

java设计模式适配器模式适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码。 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比。 在设计一个面向对象的应用程序时,当我们的客户期望一个特…

技术路线的选择重要但不具有决定性

微软在技术上连续大动作,如果放在几年前,我相信微软粉丝们一定是欢声雷动,不过这次情况有点不太一样,在网上看到有人在抱怨微软技术更新速度太快而且四面出击,还有人扬言要改弦更张,投奔Linux或者Java阵营。…

nproc是什么意思_top/htop内容的含义

uptimeuptime命令显示了load avg,它其实是读取的/proc/uptime文件:/proc/uptime 文件cat /proc/uptime9592411.58 9566042.33第一个是系统启动了多久(单位s),第二个意思是系统启动以来,cpu idle花费的时间(单位s)。多核机器上&…

进程间通信(IPC)+进程加锁解锁

【0】README 0.1) source code and text description are from orange’s implemention of a os;0.2) for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/ipc_8 【1】看看,我们的进程代…

QA与测试到底有什么区别?

文章目录引言QA与测试的区别?QA、QC、QM的关系与区别?QA工作内容与职责引言 近期微信公众号后台有同学留言问: QA与测试的区别? QA、QC、QM的区别?以及QA的工作内容与职责。 针对这些问题我查阅了一些资料然后结合自…

java 进程运行时间_将Java类作为子进程运行

java 进程运行时间我本周需要将Java类(而不是jar)作为子进程运行。 更确切地说,我想从测试内部产生一个新进程,而不是直接在测试内部(进程内)运行它。 我不认为这是幻想或复杂的事情。 但是,这不…

划分vlan实验心得体会_思科:相同vlan,不同交换机之间的通信

实验拓扑如下:VPC 26 IP 23.1.1.3 24 VLAN20VPC 25 IP 12.1.1.2 24 VLAN10VPC1 IP 12.1.1.1 24 VLAN10VPC2 IP 23.1.1.2 24 VLAN20IOL交换机命名为SW1 先配置SW1的vlan10 和20检查SW1的vlan信息配置SW1的vlan10 和20检查SW2的vlan信息下一步将SW1和SW2连接的接口改为…

如何通过W3school学习JS/如何使用W3school的JS参考手册

文章目录学习JS对象DOM 对象HTML 对象JS 的常规类型教程学习 jQuery学习平台: W3school类似的学习平台: 菜鸟教程学习JS对象 DOM 对象 HTML 对象 JS 的常规类型 教程 学习 jQuery

快速选择

【0】README 0.1)设有一组N 个数而要确定其中第k 个最小(大)者,我们称之为选择问题; 选择问题的解法?” 解法即为 快速选择算法; 0.2) 快速选择是对 快速排序 改造而来&#xff0…

java模板方法模式_Java中的模板方法模式

java模板方法模式模板方法模式是一种行为模式,建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是,算法后面的任何更改只会影响超类中的代码。 此外,它还…

hive 索爱_达内大数据云计算

第一阶段(Java基础)Java语言的高级特性静态导入、自动封箱拆箱、可变参数、增强for、枚举、类加载器、反射、内省、泛型、注解、动态代理回掌握Java语言的高级特性Java多线程多线程加强、线程池、Thread Local掌握Java线程池技术,掌握线程的Join、notify、notifyAll…

建立文件系统

【0】README 0.1) source code and text description are from orange’s implemention of a os and for complete code, please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/orange_s_fs.tar; 0.2) 此文件系统涉及到的…

判断字符串是否为空

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>检查指定的值是不是空字符串</title><script>function test_1() {// var name document.getElementById("name").value;// ale…

java策略设计模式_Java中的策略设计模式

java策略设计模式策略设计模式是一种行为模式&#xff0c;其中我们有多种算法/策略来完成一项任务&#xff0c;所使用的算法/策略留给客户选择。 各种算法选项封装在单独的类中。 在本教程中&#xff0c;我们将学习在Java中实现策略设计模式。 UML表示形式&#xff1a; 首先&…

随机森林算法 python_Python实现的随机森林算法与简单总结

本文实例讲述了Python实现的随机森林算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;随机森林是数据挖掘中非常常用的分类预测算法&#xff0c;以分类或回归的决策树为基分类器。算法的一些基本要点&#xff1a;*对大小为m的数据集进行样本量同样为m的有放回抽样&…

Hibernate的学习笔记

文章目录简介配置文件hibernate.cfg.xml映射配置文件主键生成方式主键生成方式的配置identitysequencenativeincrementassigned映射类型使用 Hibernate 实现 CRUD简介 Hibernate是对象关系映射&#xff08;ORM&#xff0c;Object RelationShip Mapping&#xff09;框架&#x…

在diy的文件系统上创建文件的流程

【0】README 0.1&#xff09; source code are from orange’s implemention of a os , and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/fs_create_file_p366 &#xff1b; 0.2&#xff09;本文总结的内容是干货&#xff0c;…