java—程序绑定

程序绑定概念:

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

静态绑定(前期绑定)

针对java而言,在编译期间进行绑定。java方法中只有final、static 、private、构造函数是前期绑定的。

  • final—用final修饰方法防止方法被覆盖,不能被继承因此有效的关闭java中的动态绑定
  • static—不能被继承
  • private—不能被继承
  • 构造函数—根源上是final修饰的
动态绑定(后期绑定):

在程序执行期间根据具体对象的类型进行绑定。
java中后期绑定都是由jvm(java virtual machine)虚拟机来实现的。向上转型和多态都是利用动态绑定实现的。
动态绑定的过程:

  1. 虚拟机提供对象的实际类型的方法表
  2. 虚拟机搜索方法签名
  3. 调用方法。

详细步骤如下:

  1. 编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法,并且x已经声明为C类对象。那么编译器会列举出C类中所有名称为f的方法和从C类的超类继承过来的f方法。
  2. 编译器检查方法调用的参数列表和返回列表。重载解析,找到与调用方法相同的方法。
  3. 当程序运行时,使用动态绑定调用方法。虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。
调用接口总比调用继承慢,为什么?

参考《深入java虚拟机》P336页解释: java虚拟机使用不同于类引用的操作码来调用接口引用的方法,这是因为java不能象使用引用那样,使用许多与方法表偏移量相关的假设。对于类引用来说,无论对象实际的类是什么,方法在方法表始终占据相同的位置。但对于接口引用来说,情况就不是这样了,位于不同类的同一个方法所占据的位置是不同的,尽管这些类实现同一个接口。
最大的区别是:接口调用每次都需要搜索接口表(接口可以在不同的类里实现,查找策略只能是全部遍历),而调用继承类则可以根据序号找到(因为继承类的方法在方法表里是有顺序的而且固定的,可以用序号作为索引搜索)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值