一:绑定

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

二:静态绑定

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

在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

转载于:https://www.cnblogs.com/zyx1205/p/8624684.html

Java方法的静态绑定与动态绑定讲解相关推荐

  1. java 静态绑定原理_Java方法的静态绑定与动态绑定讲解

    一:绑定 把一个方法与其所在的类/对象 关联起来叫做方法的绑定.绑定分为静态绑定(前期绑定)和动态绑定(后期绑定). 二:静态绑定 静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的, ...

  2. [转载] Java静态绑定与动态绑定

    参考链接: Java中的静态绑定与动态绑定 程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定. 静态 ...

  3. Java静态绑定与动态绑定

    程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定(也就是说 ...

  4. Java多态与泛型 ,动态绑定,静态绑定

    文章目录 (一)多态 1.概念 1.1 使用继承: 1.2 实现接口(推荐): 2.作用 3.多态的实现原理 3.1 Java 动态绑定以及内部实现机制 程序绑定的概念 关于final.static. ...

  5. java动态绑定和静态绑定区别_理解静态绑定与动态绑定

    一个Java 程序要经过编写.编译.运行三个步骤,其中编写代码不在我们讨论的范围之内,那么我们的重点自然就放在了编译 和 运行这两个阶段,由于编译和运行阶段过程相当繁琐,下面就我的理解来进行解释: J ...

  6. Java的静态绑定与动态绑定

    我们可以对思考一个问题: JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto b ...

  7. java 语言如何判断素数_C语言实验之判断素数(循环结构java)方法讲解

    C语言实验之判断素数(循环结构java)方法讲解 Problem Description 从键盘上输入任意一个正整数,然后判断该数是否为素数. 如果是素数则输出"This is a prim ...

  8. C语言循环结构素数判断,C语言实验之判断素数(循环结构java)方法讲解

    C语言实验之判断素数(循环结构java)方法讲解 Problem Description 从键盘上输入任意一个正整数,然后判断该数是否为素数. 如果是素数则输出"This is a prim ...

  9. Day07(续)Java方法讲解

    Java方法详解 何谓方法 package com.kuang.method;public class Demo01 {//main方法public static void main(String[] ...

最新文章

  1. Django视图层总结
  2. node安装升级过程中遇到的问题汇总
  3. Windows用管理员方式启动cmd (全面)
  4. Postman status: 415_415亩!白云首宗农村土地规模化流转成功签约
  5. axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题
  6. 30天敏捷结果(6):周五回顾,找到三件做的好以及三件需要改善的事情
  7. 美赛整理之带参数的常微分方程拟合问题研究
  8. 大学计算机Excel考试内容,大学计算机考试—Excel(操作题供参考,不附练习文件)...
  9. Dojo1.11官方教程文档翻译(3.5)动画
  10. 小程序根据不同用户,显示不同tabBar
  11. Nginx 动静分离 -02
  12. 深度学习平台的搭建(anaconda-pytorch-pycharm)
  13. 备受推崇的《R语言实战》真的值得如此好评吗?
  14. 多文件批量下载打包成.zip
  15. 常青科技冲刺A股上市:研发费用率较低,关联方曾拆出资金达1亿元
  16. 继承的学习总结与感悟
  17. 基于Pix4Dmapper的大疆精灵4无人机影像处理
  18. 【Codecs系列】视频会议中的AV1编解码器
  19. Java格式化输出(表格样式)
  20. 从阿里巴巴B2B的技术实践看互联网企业如何提升研发效能

热门文章

  1. php soap 用户名密码,PHP SOAP客户端帮助!
  2. FilterListener笔记
  3. 分布式系统Kafka和ES中,JVM内存越大越好吗?
  4. php mysql 大量读取_PHP使用PDO从mysql读取大量数据处理详解
  5. hive一次加载多个文件_0738-6.2.0-如何在Hive中使用多分隔符
  6. hadoop配置文件的加载机制
  7. 分布式理论(七): 一致性协议之 ZAB
  8. 通过btrace排查线上频繁Full GC的case 1
  9. Linux环境搭建nginx负载
  10. Err Welcoe to emergency mode