教你通俗的理解静态绑定与动态绑定

您所在的位置:网站首页 java静态编译和动态编译区别在哪 教你通俗的理解静态绑定与动态绑定

教你通俗的理解静态绑定与动态绑定

2024-07-13 17:40:40| 来源: 网络整理| 查看: 265

## 静态绑定与动态绑定 考虑到程序是一条一条指令执行的,因此它的流程应该尽可能的简洁优雅。在此基础上,可以更方便的理解两种绑定机制。

### 静态绑定 **所谓静态,书同上文,就是在==编译期就可以确定的东西==**。静态绑定,就是在编译器就可以进行绑定的意思。比如,**静态变量**和**静态方法**。总是通过`类名.方法名`,`类名.变量名`调用的。静态绑定是根据声明来的,换句话说,是根据栈里的类型来的,再换句话来说,是根据==静态类型==来访问的(当然与之相对的有==动态类型==的说法)。除此之外,还有什么是在编译期就能确定的呢?**私有方法**,类的私有方法只在类的内部可见,因此也可以静态绑定。还有**实例变量**,它的值就是变量所在的地址里的值,这个地址是确定的。举例而言:

```JAVA 父类Base和子类Child,有着同名的静态变量s和实例变量a Child c = new Child(); Base b = c; b.s 会被处理成Base.s b.a 会被处理成Base.a c.s 会被处理成Child.s c.a 会被处理成Child.a ```

那么可能就会有疑惑了,实例应该会有很多个吧,比如再new一个c1、c2呢?这个时候,要结合存储模型和程序机制来看。

 c、c1、c2、...、cn,都只是为了让人好理解的、给地址取的别称,它只是为了指示地址,和实例有关的信息都保存在堆里,对于静态绑定而言。`c.a`的意思是去c地址去取a的值,但是c地址有两个a变量的值,应该以哪个为准呢?程序就去找c的类型,看声明,为Child c,故而,在c地址取Child.a这个变量的值。此之为静态绑定。所以c1.a就是在c1地址取Child.a这个变量的值。

### 动态绑定 所谓动态,就是与静态相反的概念,即在编译期无法确定的资源,只有在运行时才能确定。一个类中,适用于静态绑定的元素有:类变量,类方法,实例变量,私有方法;那么剩下的元素就是静态绑定无法解决的,需要采用新的方法进行绑定,即动态绑定。剩下的元素,即非私有且非静态方法。为何这个元素无法静态绑定呢?因为类的继承,是一个由抽象到具体的过程,顺着继承链,类里面的行为,也是由简略到详细的过程。比如吃饭的行为: 1. 父类:吃饭 2. 子类:先洗手再吃饭 3. 孙类:洗完手在吃饭,吃完饭还得洗碗。 那么,在执行时,为了保证程序的可用与严谨,需要使用尽可能具体的行为(此句为YY)。 程序在拿到一个方法后,会获得三个信息: 1. 调用者实际类型 2. 方法名 3. 参数列表     - 数量     - 类型     - 顺序 为了找到最适配的方法,系统会从子类开始往父类比对方法。这个时候,把自己当成系统,那么会面临这么几种情况: 1. 在该调用者指向的方法区找到了一个唯一100%契合的方法,执行之。 2. 该调用者指向的方法区里没有找到100%契合的方法?怎么办?那去看他祖宗十八代有没有,欸嘿,找到了一个唯一100%契合的方法,执行之。 3. 找到了2个100%契合的方法,爷爷有一个,太太爷爷有一个,那就用爷爷的,越新越好嘛。 4. 祖宗18代也没找到100%契合的方法?怎么办?有没有勉强能用的方法?找个勉强能用的凑合凑合得了。于是从调用者往祖宗里找到了唯一一个90%契合度的方法,改造改造,凑合用吧(==即自动类型转换,比如把int参数提升成Double参数来用适用于Double参数的方法==) 5. 找到了2个90%契合的方法,爷爷有一个,太太爷爷有一个,那就用爷爷的,越新越好嘛。 以上的过程就是动态绑定。聪明的你会发现一个问题,就是有祖宗1000代,祖宗10000代怎么办?找祖宗都得找三天两夜的。为了解决祖宗过多,每次调用方法都要拜访10000次的难题,引入了虚方法表,就是在这个孙子类进行类加载的时候,就先挨个拜访一下祖宗,然后在孙子的方法区,直接把孙子的方法名指向最适合的代码处。举个例子,拉屎,现在孙子拉屎和19代祖宗的拉屎一样,都是用屁股拉,那么把孙子的拉屎方法名指向19代祖宗的拉屎代码区,当孙子要拉屎时,就不用再去找怎么拉屎了,直接把19代祖宗的拉屎代码拿来用。而擦屁股,孙子和儿子一样,都用卫生纸,而19代祖宗用石头擦的,啥时代了,还用石头擦?于是孙子把擦屁股的方法指向了儿子擦屁股的代码,拉完屎擦屁股的时候,就不用挨个去问祖宗们,再对比选出一个最好的擦屁股方法了,直接用儿子的方法。

 以上仅用于理解动态绑定与静态绑定。不对严谨性负责。

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭