静态链接,静态分派,动态链接

简介: 静态链接,静态分派,动态链接

静态链接:

编译时即可确认要转换成哪个直接引用。

编译的时候由于能够确定变量的静态类型,所以编译时可知,也就是为什么叫做静态链接的原因。接下来解释下为什么能够确定变量的静态类型并且是怎么确定的。

首先明确一个点:静态类型和实际类型都是可以改变的。唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明)。

静态链接发生的阶段其实也可以分为:静态分派和解析阶段

解析阶段就是将编译期可以确定不会发生变化的符号引用转换为直接引用。

有以下这些:

这些叫做非虚方法也就是运行时不会发生变化,编译期即可确定

而静态分派则是更改变量的静态类型,但是也可以确定编译时期不会发生变化。

(静态分派和动态分派的区别在于:静态分派是根据静态类型来确定调用的方法是哪个,而动态分配时根据变量的实际类型。由此可以得出静态分派在编译时就可以确定,而动态分派需要运行时)

典型的栗子就是方法的参数是根据参数的静态类型来决定调用哪个方法,重载就是利用的这点实现的,而调用多态则是根据变量的实际类型来确定的,

比如方法的重写。

而且当找不到对应的静态类型的时候在还会默认对静态类型进行转换。

动态链接

编译时不能确认转换成哪个引用要等到运行时才可以确认调用的是哪个方法。

动态链接是和变量的实际类型相关的,因为变量的实际类型不能够在编译时确定只能等到运行时才可以,比如某个条件成立就将这个变量转换为A,不成立转为B(前提这个条件的成立与否必须是运行时才可以确定的,不能够在编译时就能够确认比如if(true) ),这个条件的成立必须是运行时才可进行确定的不能够在编译的时候就知道其实际类型是什么。所以叫做动态链接运行时才可以确定。



目录
相关文章
|
数据格式 JSON 存储
Lua模块的加载与内存释放
今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了。因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行测试。
2078 0
|
10月前
|
安全 Java
JVM类装载的执行过程
JVM(Java虚拟机)类装载的执行过程包括以下几个步骤:
58 0
|
10月前
|
开发者
静态链接与动态链接
空间链接使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,从某种意义上来将大大促进了程序开发的效率,原先限制程序的规模也随之扩大。但是慢慢地静态链接的诸多缺点也逐步暴露出来,比如浪费内存和磁盘空间、模块更新苦难你等问题,使得人们不得不寻找一种更好的方式来组织程序的模块。本文简单介绍静态链接与动态链接。
|
12月前
|
存储 Java 数据库连接
动态字节码
在Java中其字节码以二进制的形式存储在class文件中,每一个class文件都包含一个java类或接口,我们可以通过一些动态字节码技术去实现动态创建类、添加类的属性和方法、设置类的父类,以及修改类的方法等操作。常用的动态字节码类库有Javassist、ASM等。而Javassist相比ASM其不需要接触JVM底层的指令,只需要使用Javassist提供API接口就可以实现动态字节码编程,Mybatis动态是实现Dao接口底层也是使用到了Javassist技术,所以这篇文章主要介绍一下Javassist的使用。
84 0
|
12月前
|
API
9-FreeRTOS之静态内存分配与动态内存分配
9-FreeRTOS之静态内存分配与动态内存分配
|
存储 安全 Java
JVM详解之:汇编角度理解本地变量的生命周期
JVM详解之:汇编角度理解本地变量的生命周期
JVM详解之:汇编角度理解本地变量的生命周期
|
自然语言处理 前端开发 Java
JVM13_字节码文件的跨平台、前端编译器、什么是字节码指令(一)
①. 字节码文件的跨平台性(了解) ②. Java的前端编译器(了解)
115 0
JVM13_字节码文件的跨平台、前端编译器、什么是字节码指令(一)
|
数据可视化 前端开发 Java
JVM13_字节码文件的跨平台、前端编译器、什么是字节码指令(二)
③. 透过字节码指令看代码细节 ④. 如何解读供虚拟机解释执行的二进制字节码?
JVM13_字节码文件的跨平台、前端编译器、什么是字节码指令(二)
|
调度
FreeRTOS静态和动态创建任务
FreeRTOS静态和动态创建任务
429 0