前期绑定和后期绑定
转载自:https://blog.csdn.net/youngyouth/article/details/79747043
在多态的时候,我们将子类的类型向上转换为父类,进行类型的泛化,便于我们写出实用性很强的代码,新类型不用改变原有代码。
这里有个问题就是:任何类型传进去都是父类型 ,但是在方法调用的时候,却是调用的子类的方法,或者说,编译器是怎么知道,具体该调用哪一个方法的呢?
这就与前期绑定和后期绑定有关系了。
-
前期绑定
前期绑定是面向过程语言的编译器做法:编译器在编译面向过程语言的时候,在出现函数调用的时候,会产生一个对具体函数名字的引用,这样在程序运行的时候,执行到函数调用的语句,就会发现这里一个对 XXX 方法的引用,就会把执行逻辑解析到这个方法的绝对地址上(就是说编译器在编译完成的时候就已经知道这个方法到底是哪个类中的方法)。
但是这一套到了 Java 这里就不好使了,编译器在编译代码的时候,它是无法知道具体调用的方法(也有例外,Java 中的 final、static、private 和构造方法这些方法是前期绑定)。
-
后期绑定
既然编译时期,编译器搞定不了大部分方法调用的问题,那么就在运行时期来完善:这就是后期绑定。
Java 是这样来搞定方法调用的:在每一个对象中存储一小段信息,通过这一小段信息,可以计算出该对象的方法地址,然后去调用方法。
- 所以 Java 有句名言叫:编译看左边,运行看右边。
- 这个其实就是后期绑定的原因,Java 的编译器在编译期间,会检查这个要调用的方法是否存在,调用的参数是否准确,返回的类型是否正确;而在运行期,就根据信息去调用具体方法。
- 所以 Java 有句名言叫:编译看左边,运行看右边。