Java多态的本质

Parent类有方法a,ChildA childB都有方法a, 一个逻辑在调Parent类型的a方法时,传入ChildA实例和ChildB实例都是可以运行的,这称为Java的多态机制。
这是如何做到的呢?

      OO的设计诀窍:Javac编译器不产生传统意义上的函数调用。传统编译器会产生【前期绑定】,即编译器在编译阶段将产生对一个具体函数名字的调用,而运行时将这个调用解析到要被执行的代码的绝对地址,而在OOP中程序直到运行时才能够确定代码的地址,所以采用【后期绑定】的概念,当向对象发送消息时,被调用的代码直到运行时才确定。

       Java中除了static方法和final方法(private方法属于final方法,构造方法属于隐式static方法)之外,其他所有的方法都是后期绑定,并且所有的属性都不具备多态,即类的属性域是在编译器决定的。

      Javac编译器在编译时确保方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的预言被称为弱类型的),但是并不知道将被执行的确切代码。为了执行后期绑定,Java使用了一小段特殊的代码来代替绝对地址调用。这段代码使用对象中存储的实际类型信息来计算方法体字节码指令的地址。

    【前期绑定】:将一个方法调用同一个方法主体关联起来被称为绑定,若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。

    【后期绑定】:在运行时根据对象的类型绑定具体方法主体的字节码指令地址。后期绑定的预言必须具有某种在运行时判断对象类型的机制,从而调用恰当的方法。不管怎样,实现的思路都是在运行时对象中安置能找到具体类型地址的信息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值