所谓动态绑定,通俗的就是指,对象在调用方法的时候能够自己判断该调用谁的方法。所以动态绑定一般发生在继承、方法重载时。
那么发生方法重载时,编译器如何确定调用的方法呢?例如,调用c.f(arg)时,首先需要将c声明为B类的对象。此时如果在B类中,存在多个 f 方法,只是f的参数类型不同,调用 f(int) 或者 f(String) 时,编译器逐一列举B类中所有名为f的方法以及B类超类中访问权限为public的名为 f 的方法。如果存在与c.f( arg )中arg类型相匹配的方法,那么就调用这个方法。由此,调用哪个方法依赖于隐式参数的实际类型。这个过程可以就是一个动态绑定的过程。
如果这个方法是private、static或者final类型的,就不用进行动态绑定了,因为编译器可以很准确地知道要调用哪个方法。且查询匹配方法时,是按照继承树逐级向上查找的,直到找到第一个匹配的为止。
但是由于Java中允许类型转换,所以寻找合适的方法是一个复杂的过程,如果编译器没有找到合适的方法,或者发现类型转换后有多个方法与之匹配,则编译器会报错。