美文网首页java面向对象基础
Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

作者: Jibert | 来源:发表于2018-03-22 16:03 被阅读0次


  一:绑定

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

  二:静态绑定

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

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

 三:动态绑定

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

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

 动态绑定语句的编译、运行原理:我们假设 Father ft=new Son();  ft.say();  Son继承自Father,重写了say()。

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

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

                     编译阶段是确保方法的存在性,保证程序能顺利、安全运行。

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

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

 四:区分

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

参考:https://www.cnblogs.com/ygj0930/p/6554103.html

相关文章

  • Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

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

  • 程序绑定

    绑定 指一个方法的调用与方法所在的类(方法主体)关联起来。对Java来说,绑定分为静态绑定(编译期绑定)和动态绑定...

  • 多态:动态绑定

    动态绑定 程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态...

  • Java-动态绑定和静态绑定

    绑定 一个方法的调用与方法所在的类关联起来。java中的绑定分为静态绑定和动态绑定,又被称作前期绑定和后期绑定。 ...

  • 静态绑定与动态绑定

    参考资料:Java之动态绑定与静态绑定 绑定就是一个方法的调用与调用这个方法的类连接在一起的过程被称为绑定。 静态...

  • 面向对象多态

    1.条件:继承的情况下 向上转型(编译期静态绑定和运行期动态绑定) 自动类型转换 向下转型 强制类型转换 要...

  • 静态绑定(前期绑定) 与 动态绑定(后期绑定)

    绑定   绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来,绑定分为静态绑定(前期绑定) 和 动态绑定(...

  • 程序语言基础知识

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

  • JAVA动态绑定与静态绑定

    程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动...

  • Java静态绑定与动态绑定

    目录介绍 01.什么是绑定 02.静态和动态绑定 03.辅助理解jvm图 04.动态绑定编译原理 05.动态绑定运...

网友评论

    本文标题:Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

    本文链接:https://www.haomeiwen.com/subject/pzhiqftx.html