前期绑定和后期绑定的区别
在java多态调用中,对于需要传入一个类的方法,我们可以传入该类的子类,从而调用子类的重写后的方法。之所以编译器可以确定调用哪个对象的方法,主要跟前期绑定和后期绑定有关。
绑定
将一个方法调用同一个方法主题关联起来称作绑定
前期绑定
程序执行前进行绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法)。编译程序时,在出现函数调用的时候,会产生一个对具体函数名字的引用,这样在程序运行的时候,执行到函数调用的语句,就会发现这里一个对XXX方法的引用,就会把执行逻辑解析到这个XXX方法的绝对地址上,例如final(final会关闭后期绑定),static,private,构造方法,成员变量(包括静态及非静态)都是属于前期绑定,C方法调用都是前期绑定
后期绑定(动态绑定或运行时绑定)
程序在运行前虚拟机并不知道类的类型,运行时根据对象的类型进行绑定。后期绑定主要通过对象中安置某种“配置信息”,然后利用这一段信息,虚拟机可以计算出该对象的方法地址,然后去调用,实现了类型的识别和方法的调用。
动态绑定的过程:
- 虚拟机提取对象的实际类型的方法表;
- 虚拟机搜索方法签名;
调用方法。
除了前期绑定的,其他都是后期绑定。
参考文章:
- 前期绑定 和 后期绑定
- Java前期(静态)绑定和后期(动态)绑定
- Java编程思想
还没有评论,来说两句吧...