我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:彩库宝典 > 动多态 >

多态的实质:静态绑定(编译时绑定)与动态(运行时)

归档日期:07-08       文本归类:动多态      文章编辑:爱尚语录

  1.能被重写的方法为虚方法,虚方法是动态绑定的,因为可以被重写所以通过声明的类型去查找方法地址就不靠谱了(因为多态的出现父类的声明可能是子类的实例),所以只有在运行的时候才能确定是哪个类的引用,不能被重写的例如由static、private、final修饰的方法是静态绑定的,因为不能重写所以这个方法逻辑是不变的,也就能很早的确定方法的地址。

  如果某个Java方法是final的或者不是虚方法的话,它就可以做静态绑定。

  Java虚拟机规范第二版中定义了四种不同的字节码指令来处理Java程序中不同种类的方法的调用。包括,

  其中,invokestatic与invokespecial调用的目标必然是可以静态绑定的,因为它们都无法参与子类型多态;invokevirtual与invokeinterface的则一般需要做运行时绑定,JVM实现可以有选择的根据final或实际运行时类层次或类型反馈等信息试图进行静态绑定。

  把一个方法与其所在的类/对象 关联起来叫做方法的绑定。绑定分为静态绑定(前期绑定)和动态绑定(后期绑定)。

  静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法。

  在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。

  动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。

  动态绑定是多态性得以实现的重要因素,它通过方法表来实现:每个类被加载到虚拟机时,在方法区保存元数据,其中,包括一个叫做 方法表(method table)的东西,表中记录了这个类定义的方法的指针,每个表项指向一个具体的方法代码。如果这个类重写了父类中的某个方法,则对应表项指向新的代码实现处。从父类继承来的方法位于子类定义的方法的前面。

  1:编译:我们知道,向上转型时,用父类引用执行子类对象,并可以用父类引用调用子类中重写了的同名方法。但是不能调用子类中新增的方法,为什么呢?

  因为在代码的编译阶段,编译器通过声明对象的类型(即引用本身的类型)在方法区中该类型的方法表中查找匹配的方法(最佳匹配法:参数类型最接近的被调用),如果有则编译通过。(这里是根据声明的对象类型来查找的,所以此处是查找 Father类的方法表,而Father类方法表中是没有子类新增的方法的,所以不能调用。)

  2:运行:我们又知道,ft.say()调用的是Son中的say(),这不就与上面说的,查找Father类的方法表的匹配方法矛盾了吗?不,这里就是动态绑定机制的真正体现。

  上面编译阶段在 声明对象类型 的方法表中查找方法,只是为了安全地通过编译(也为了检验方法是否是存在的)。而在实际运行这条语句时,在执行 Father ft=new Son(); 这一句时创建了一个Son实例对象,然后在 ft.say() 调用方法时,JVM会把刚才的son对象压入操作数栈,用它来进行调用。而用实例对象进行方法调用的过程就是动态绑定:根据实例对象所属的类型去查找它的方法表,找到匹配的方法进行调用。我们知道,子类中如果重写了父类的方法,则方法表中同名表项会指向子类的方法代码;若无重写,则按照父类中的方法表顺序保存在子类方法表中。故此:动态绑定根据对象的类型的方法表查找方法是一定会匹配(因为编译时在父类方法表中以及查找并匹配成功了,说明方法是存在的。这也解释了为何向上转型时父类引用不能调用子类新增的方法:在父类方法表中必须先对这个方法的存在性进行检验,如果在运行时才检验就容易出危险——可能子类中也没有这个方法)。

  程序在JVM运行过程中,会把类的类型信息、static属性和方法、final常量等元数据加载到方法区,这些在类被加载时就已经知道,不需对象的创建就能访问的,就是静态绑定的内容;需要等对象创建出来,使用时根据堆中的实例对象的类型才进行取用的就是动态绑定的内容。

  重写(Override):(1)父类与子类之间的多态性,对父类中的方法进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写了(Overriding)。在Java中,子类可...博文来自:xiaoyanol的博客

  当用virtual关键字来声明一个成员函数,编译器机会根据动态绑定机制在幕后完成一些工作。当编译器发现类中有虚函数的时候,编译器会创建一张虚函数表,把虚函数的函数入口地址放到虚函数表中,并且在类中增加...博文来自:vinnyjia的博客

  编译时类型和运行时类型:  Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不...博文来自:CrystalDestiny的专栏

  视频地址:Java之多态的本质:子类就是父类更多精彩内容,敬请扫码关注(HelloWorld小码农): ...博文来自:HelloWorld小码农的博客

  运行期绑定:函数的地址在运行时确定,也称之为晚期/动态绑定。主要是对虚函数的操作。编译期绑定:函数的地址在编译时确定,也称之为早期/静态绑定。主要是对非虚函数的操作。Whatisthedifferen...博文来自:我的杯中没有谁

  来源:伯乐在线专栏作者-陶邦仁Java虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法。相反,当虚拟机调用一个实例方法时,它会基于对象实际的类型(只能在运行时得知)...博文来自:Nothing

  多态性有两种:1)编译时多态性对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性.2)运行时多态性如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则...博文来自:zxf347085420的博客

  汇编、编译、解释系统一、汇编语言基本原理汇编语言源程序由若干条语句组成,一个程序中可以由3类语句:指令语句、伪指令...博文来自:tanqiuwei的专栏

  动态绑定动态绑定是指编译器在编译阶段不知道要调用哪个方法Parent父类,父类有两个方法一个是类方法shout,一个是实例方法saypublicclassParent{Stringname;publi...博文来自:光与热的博客

  一:静态绑定与动态绑定静态绑定:编译时绑定,通过对象调用动态绑定:运行时绑定,通过地址实现多态–简单是意思是多种状态静态多态:a:函数多态(重载)b:模板多态(类模板和函数模板)动态多态:a:虚函数机...博文来自:f2016913的博客

  参考资料:多态具体表现形式有两种:方法的重写和方法的重载。先来看一段程序(此段代码摘自...博文来自:zlp1992的专栏

  C++具有多态的特性,理解多态原理需要理解以下四个概念。       1、对象的静态类型(statictype):就是它在程序中被声明时所采用的类型(或理解为类型指针或引用的字面类型),在编译期确定;...博文来自:u010757019的博客

  一个一直运行正常的应用突然无法运行了。在类库被更新之后,返回下面的错误。g.NoSuchMethodError: com.nhn....博文来自:XT先生

  **C++中的多态必须具有以下三个前提条件:1.必须存在一个继承体系结构2.继承体系结构中的一些类必须具有同名的virtual成员函数(virtual是关键字)3.至少有一个基类类型的指针或基类类型的...博文来自:吾尝终日而思矣,不如须臾之所学也

  C++动态绑定C++的虚函数+派生类对象及派生类到基类的类型转换共同完成了C++面向对象程序设计的三个基本概念之一--动态绑定。同样一段代码运行时才能决定运行的具体函数是哪个(相对于编译时就能确定而言...博文

  1)多态:父类型的变量,可以引用子类型的对象classA{}classBextendsA{}那么可以Aa=newB();其中这里的A叫做声明类型,B叫做实际类型那么这里的a就可以调用B中的方法(如果有...博文来自:子衿_青青的博客

  联编在函数调用时,系统必须知道函数调用实际对应的函数实现(函数体)的地址,并把调用跟函数入口地址关联起来。这个过程称为联编,也叫作绑定(binding)。在编译的时候就能够确定函数的入口地址,这种联编...博文来自:云鹤起舞的博客

  首先注意四个概念:对象的静态类型、对象的动态类型、静态绑定、动态绑定;    1、对象的静态类型(statictype):就是它在程序中被声明时所采用的类型(或理解为类型指针或引用的字面类型),在编译...博文来自:S.H.

  Java动态绑定与静态绑定之胡思乱想之所以写这篇博客,是因为写代码过程中遇到了很奇怪的现象,我觉得只能通过动态绑定与静态绑定来解释,于是,就学习了一下动态绑定与静态绑定的实现原理,这个过程中确实学到了...博文来自:的博客

  c++语言的一个重要特性就是支持多态行博文来自:caoyan_12727的博客

  1、静态类型与动态类型C++中由于继承导致对象的指针和引用具有两种不同的类型,静态类型和动态类型。对象的静态类型:对象在声明时采用的类型,在编译时确定;对象的动态类型:目前所指对象的类型,在运行期时确...博文来自:的博客

  Java动态绑定来自于继承体现,子类继承父类,子类重新覆盖了父类的方法,就是动态绑定,以下举例:(动态绑定是在运行期间)动物类:/***创建一个动物类*@authorLiudeli*/publiccl...博文来自:刘德利CSDN博客

  接下来的一段话是我从一位博客大佬那里copy来的:对象的静态类型:对象在声明时采用的类型。是在编译期确定的。对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无...博文来自:Loser

  数据抽象,继承,多态是java的三大特征,可见理解多态对于学习java的重要性,多态不但能够改善代码的组织结构和可读性,还能够让程序更加的具有可拓展性。    理解一下什么是多态。多态就是同一事物的多...博文来自:南朝烟雨的博客

  (⊙o⊙)…,最近才看到这一块,发现java面对对象编程是从方方面面去体现的。由于java所拥有的这个多态(也叫动态绑定/迟绑定)机制,使得java不再像c这种面向过程的语言一样,java拥有了较高的...博文来自:尽力而为

  自PHP5.3.0起,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。虽然也可以调用非静态方法,但是不会在运行时绑定。static不再只是简单的静态修饰关键字。而是可以像下面...博文来自:Dont lost way

  在这个例子中使用Java面向对象中的多态来简单介绍静态绑定和动态绑定的区别。/**创建一个Father类。*为了方便获取,成员变量a设置为public的。**/classFather{publicin...博文来自:a810373329的博客

  最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题:C++类的成员函数存储方式(是否属于类的对象)两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点。一...博文来自:jiange_zh的博客

  对今天解决不了的事情,不要着急。因为明天也可能还是解决不了.哈哈,这句话送给正在被这些东西困扰的你,我也是折腾了好久,才弄清楚这些都是什么鬼[捂脸]...博文来自:明月沉江春雾晓

  所谓动态绑定,其实就是接口的实现由派生类完全覆盖。就是说原本声明的类型是基类B,但是调用函数的时候执行的却是不同派生类(由初始化或者赋值的时候定义)D的函数。动态绑定出现的条件有两个只有虚函数才能进行...博文来自:空之境界

  在调用方法时,会出现静态绑定和动态绑定的概念。但是,到底是什么意思,需要仔细思考。为了弄清所有相关概念,首先来看一下函数调用过程:编译器查看对象的声明类型和方法名。假设调用x.f(param),并且隐...博文来自:ryanloucc的博客

  动态绑定:程序在运行期间而不是在编译期间,根据所引用对象的实际类型调用对应的方法,重写以及接口的实现都属于该范畴,使用实际的对象信息来完成API的调用publicclassDynamicBind{pu...博文来自:Mark_Li

  用法类似与self,static::不再被解析为定义当前方法所在的类,而是再实际运行时计算的。比如当一个子类继承了父类的静态属性或方法的时候,它的值并不能被改变,有时不希望看到这种情况。问题:当一个子...博文来自:肖的博客

  1.多态当发出一条命令的时候,不同的对象接受到同样的命令,所做出不同的动作,或者相同对象收到不同消息或不同对象收到相同消息时产生的动作。2.静态多态(早绑定、编译时多态、重载)程序在编译之前就知道用哪...博文来自:sunSHINEEzy的博客

  在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特性。多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。在一开始接触多态这个词的时候,我们或许会因为这个词本身而感到困惑,...博文来自:QuinnNorris的博客

  在jquery中动态绑定事件的时候在里面可以用this,此时的this指代当前事件源,不过此时的this是js对象,需要加$转化为jq对象才能使用jq里面的方法在js中动态绑定事件的时候里面也可以用t...博文来自:syl2850246的博客

  多态何为多态?嗯就是多种状态,如果前面要加上代词的话,我想应该是对象。java多态可以分为三种,即重写多态、重载多态、泛型多态(通常意义上的多态指的是重写多态)。重写多态:子类可以将父类的任意虚方法根...博文来自:nvnnv的博客

  相信大部分人都听说过多态,对多态有过一些了解都知道多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。但是很少有人会深...博文来自:lius的专栏

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗!nnDocker的三大核心概念:镜像、容器、仓库n镜像:类似虚拟机的镜像、用俗话说就是安装文件。n容器:类似一个轻量...博文来自:我走小路的博客

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

本文链接:http://dalezaragoza.com/dongduotai/617.html