天天看点

Java多态之前期静态绑定与后期动态绑定

多态是面向对象中一个非常重要的功能,因为多态对象在运行的时候才知道真正类型是什么。在java中对方法的调用分为静态绑定和动态绑定两个功能。

方法调用

---->解析 (编译时绑定,静态绑定,有私有方法、final方法等唯一确认无法重写的方法)

----->分派

|----->静态分派 (重载的方法,也是可以唯一确认的方法,也是静态绑定)

|----->动态分派(重写的方法,存在多个相同的特征签名,动态绑定,运行时确认类型)

静态绑定

静态绑定的意思是在编译的时候就确定要调用的方法,就直接指向要调用的方法,该种类型只有具有以下修饰符的才会是:属性、【final、static、private的方法】,因为在编译的时候就确定了,所以调用的是声明对象的方法,而不是引用对象的。

动态绑定

动态绑定的意思是因为在多态中,真实的对象类型是运行时候才能真正确定的,所以调用到的方法是根据后期对象真实引用的对象的方法。

补充

什么时候才用动态绑定??

原因:不同的方法具有相同的特征签名(唯一标识),在编译的时候会不知道具体调用那个方法,所以只有在运行的时候才能确认具体调用那个方法。
           

为什么多态要是动态绑定,而不是静态绑定呢??

原因: java代码中确认唯一方法是根据方法名+参数顺序+参数类型进行确认的。在多态中,大家都知道,会重写某些方法。因为方法是重写,所以方法名+参数顺序+参数类型都是一样的。所以同一个方法会存在多个,这个在编译的时候就不能完全定位到一个确认的方法。只有在运行的时候根据实际的类型进行确认到一个方法,所以才要采用动态绑定。
           

为什么重载是静态绑定??

原因:重载的方法,参数顺序或者参数类型肯定不同,所以具有不同的特征签名(唯一标识),所以在编译的时候可以确认唯一的方法。