*****标题写的是介绍虚拟机栈中的动态链接,但是这里讲解的是动态链接静态链接的区别*****

一.概述:

Class文件的常量池中存在有大量的符号引用,字节码中的方法调用指令就以指向常量池的引用作为参数

  • 部分符号引用在类加载阶段(解析)的时候就转化为直接引用,这种转化为静态链接
  • 部分符号引用在运行期间转化为直接引用,这种转化为动态链接

二.虚/非虚方法

1.非虚方法:

在类加载阶段(解析时期)才会将符号引用解析直接引用的方法被称之为非虚方法

  • 静态方法、私有方法、实例构造器、父类方法,这些只需要在类加载阶段就会确定
  • 解析调用一定是一个静态过程
  • 编译器可知,运行期不可变

2.虚方法:

在运行期间将符号引用转化为直接引用的方法被称之为虚方法

三.分派

首先先了解两个概念静态类型和实际类型

public class Ocean {public static void main(String[] args) {Ocean river = new River();}
}class River extends Ocean{
}

Ocean river = new River();

静态类型:编译期间确定的类型(Ocean)

实际类型:运行期间确定的类型(River)

**********左为静态类型,右为实际类型

再了解一个概念宗量:方法的接受者(亦即方法的调用者)与方法的参数统称为方法的宗量

1.静态分派

class Ocean {
}class River extends Ocean{
}class Lake extends Ocean{
}/*** 静态分派*/
public class StaticDispatch{public void getSize(Ocean waterArea){System.out.println("Ocean is the biggest!");}public void getSize(Lake waterArea){System.out.println("Lake is bigger!");}public void getSize(River waterArea){System.out.println("River is big...");}public static void main(String[] args) {StaticDispatch dispatch = new StaticDispatch();Ocean river = new River();Ocean lake = new Lake();dispatch.getSize(lake);dispatch.getSize(river);}
}

控制台输出:

Ocean is the biggest!
Ocean is the biggest!

分析:

①定义了两个静态类型相同而实际类型却不同的变量

②重载时方法的执行依赖的是形参列表,而形参列表指的却是静态类型

③静态类型是在类加载(解析时期)就确定下来的

总结:静态分派可以解释重载

2.动态分派

abstract class Human {abstract void call();
}class Father extends Human{@Overridevoid call() {System.out.println("I am the Father!");}
}class Mother extends Human{@Overridevoid call() {System.out.println("I am the Mother!");}
}public class DynamicDispatch {public static void main(String[] args) {Human father = new Father();Human mother = new Mother();father.call();mother.call();}
}

控制台输出:

I am the Father!
I am the Mother!

程序执行过程的机器指令分析如下:

各操作指令解析:

  • 0:在java堆中为变量father分配空间,并将地址压入操作数栈顶
  • 3:复制操作数栈顶值.并压入栈顶(此时操作栈上有两个连续相同的father对象地址)
  • 4:从操作栈顶弹出一个this的引用(即两个连续father对象地址中靠近栈顶的一个),并调用实例化方法<init>:()v
  • 7:将栈顶的仅剩的一个father对象地址存入第二个本地变量表slot(1)中
  • 8~15:重复上面的操作,创建了mother对象并将其地址存入第三个本地变量表slot(2)中
  • 16.将第二个本地变量表slot(1)中引用类型数据father地址推送至操作栈顶
  • 17:调用虚方法,根据ather对象地址查询其call()方法并执行
  • 20~21:重复上面的操作,根据mother对象地址查询其call()并执行
  • 24:结束方法

总结:从上面的invokevirtual可以知道方法call()的符号引用转换是在运行时期完成的,所以可以说动态分派解释了重载

3.单分派&多分派

单分派是指根据一个宗量就可以知道调用目标()即应该调用哪个方法)

多分派需要根据多个宗量才能确定调用目标

总结:

java的静态分派属于多分派类型

java的动态分派属于单分派类型

 Java 语言是一门静态多分派(方法重载)、动态单分派(方法重写)的语言.

JVM-虚拟机栈之动态链接相关推荐

  1. jvm虚拟机栈的作用

    jvm虚拟机栈的作用 jvm虚拟机栈栈帧的组成 jvm虚拟机栈,也叫java栈,它由一个个的栈帧组成,而栈帖由以下几个部分组成 局部变量表-存储方法参数,内部使用的变量 操作数栈-在变量进行存储时,需 ...

  2. JVM虚拟机栈的栈帧结构中动态链接的理解

    <深入理解Java虚拟机>书中原文写到: 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接(Dynamic Linking).通过第 ...

  3. 【Java 虚拟机原理】栈帧 | 动态链接 | 方法区 | 字节码文件二进制分析

    文章目录 前言 一.方法区 二.字节码二进制文件分析 三.动态链接 1.动态链接简介 2.静态链接与动态链接 3.早期绑定 和 晚期绑定 4.动态链接示例 前言 " 栈帧 " 中存 ...

  4. JVM---虚拟机栈(动态链接与方法返回地址)

    虚拟机栈-动态链接 动态链接.方法返回地址.附加信息 :有些地方被称为帧数据区: 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用的目的就是为了支持当前方法的代码能够实现动态链 ...

  5. JVM 虚拟机栈详解

    当Java虚拟机运行程序时.每当一个新的线程被创建时.Java 虚拟机都会分配一个虚拟机栈,Java虚拟机栈是以帧为单位来保存线程的运行状态.Java栈只会有两种操作:以帧为单位进行压栈跟出栈. 某个 ...

  6. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  7. JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理

    1.数据结构栈 栈是一种比较简单的数据结构,后进先出.栈本身是一个线性表,但是这个表中只有一端允许数据的进出.栈的常用操作包括入栈push和出栈pop,对应于数据的压入和弹出.由于栈后进先出的特性,常 ...

  8. 【JVM】运行时数据区介绍,程序计数器和虚拟机栈详解

    JVM越来越是Java面试中的重头戏,今天来总结一下JVM运行时数据区的相关内容. 文章目录 JVM运行时数据区 JVM运行时数据区内部结构 程序计数器(PC寄存器) 程序计数器的介绍 PC寄存器的实 ...

  9. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

最新文章

  1. JavaScript EventLoop
  2. 曾经我也迷茫,你还在迷茫吗?写给像我一样的在校计算机专业学生作者:Cat_Lee 来源:博客园 发布时间:2009-05-30 20:25 阅读:1104 次 原文链接 [收藏]
  3. PAT甲级 -- 1009 Product of Polynomials (25 分)
  4. 《Java多线程编程核心技术》读后感(十五)
  5. java插入排序算法实现
  6. sql 日期函数往前推当前时间指定天数
  7. BUPT Summer Journey #test6 D
  8. 什么是云桌面?云桌面的三大基本架构组成部分
  9. SAP BAPI BAPI_GOODSMVT_CREATE Goods movement
  10. 八、PyQt5绘图技术
  11. pixiv的服务器信息,Pixiver™
  12. 《人类简史》笔记二——一场永远的革命
  13. 用c++写一个cps测试
  14. 蓝牙HC-05出现进入AT模式之后串口发送AT无返回值或者返回乱码情况
  15. C语言 五种基本的算术运算符
  16. Gym - 101612A 点亮数字
  17. 科研笔记4:从图片中测量面积、提取数据
  18. 大数据公司宣传语 公司文化企业文化
  19. 瑞丽的SQL-基于窗体的排名计算
  20. AAtest实验方法

热门文章

  1. 2 REST framework -- 上
  2. Shazam 是如何听音辨曲的?
  3. R语言读取Excel表格数据并绘制多系列柱状图、条形图
  4. 符文(灵晶)效果及入手方法一览
  5. php多用户商城系统推荐
  6. 分数的乘法公式是什么
  7. 转--孟岩《理解矩阵》
  8. Codeforces Round #829 (Div. 2)
  9. 前世的五百次回眸才能换得今生的一次擦肩而过
  10. linux mv 命令撤销,Linux mv 命令