区块链技术博客
www.b2bchain.cn

java多态、动态绑定

这篇文章主要介绍了java多态、动态绑定,通过具体代码讲解7819并且分析了java多态、动态绑定的详细步骤与相关技巧,需要的朋友可以参考下

本文实例讲述了java多态、动态绑定。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/?p=7819。具体如下:

如果是在编译时期解析,那么就称之为静态绑定(static binding),如果方法的调用是在运行时期解析,那就是动态绑定(dynamic binding)或者延迟绑定(late binding)。

多态使得父类型的引用变量可以引用子类型的对象。

 

如果调用子类型对象的一个虚方法(非private,final or static),编译器将无法找到真正需要调用的方法,因为它可能是定义在父类型中的方法,也可能是在子类型中被重写(override)的方法,这种情形,只能在运行时进行解析,因为只有在运行时期,才能明确具体的对象到底是什么。这也是我们俗称的运行时或动态绑定(runtime or dynamic binding)。

另一方面,private static和final方法将在编译时解析,因为编译器知道它们不能被重写,所有可能的方法都被定义在了一个类中,这些方法只能通过此类的引用变量进行调用。这叫做静态绑定或编译时绑定(static or compile time binding)。所有的private,static和final方法都通过静态绑定进行解析。

 

这两个概念的关系,与“方法重载”(overloading,静态绑定)和“方法重写”(overriding,动态绑定)类似。

动态绑定只有在重写可能存在时才会用到,而重载的方法在编译时期即可确定(这是因为它们总是定义在同一个类里面)

 

 

一个对象的多态方法的地址将被存储在该对象的方法表(method table)里面。

在运行时期,调用多态方法的时候,JVM会在此表中搜索方法的名字,从而获取方法的地址。、

方法表里包含方法的名字和对应的地址(注意,这个地址是动态绑定的)。这个方法表对所有属于这个类的对象而言,都是一样的,所以它会存储在Class对象中(这里对象类型以Integer为例)(在其他的语言中,这样的表又叫做vtables,虚函数表)。需要说明的是,java语言中,如果没有添加任何关键字,则方法默认就是虚方法,任何子类都可以重写它。

JVM实现,则选择了将方法表入口放在对象的常量池(constant pool)里,你可以使用命令java -verbose foo来查看。(所有的属于同一个类型的对象都将拥有同一个方法表,JVM也可以将其放在别的地方)

方法表中的方法名这一项,只包含最初始的类名,所谓重写,只是修改了地址栏下的值,不会改变方法名的值。

java多态、动态绑定

本文地址https://www.b2bchain.cn/?p=7819

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » java多态、动态绑定
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们