java核心技术----多态

基本概念:

  1. 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)(也可以理解为向上转型)
  2. 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  3. 多态的作用:消除类型之间的耦合关系。

 

多态存在的三个必要条件:
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。

 

动态绑定:

java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来,java中private方法,final方法,static方法或者构造器都是静态绑定实现的

静态绑定:在程序执行前已经绑定,由编译器或其他连接程序实现

动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法

动态绑定实现步骤:

1.编译器查看对象的声明类型和方法名

假设我们调用x.f(param),且x声明为C类的对象,则编译器会例举出所有C类中的f的方法和父类、类中public修饰名为f的方法(父类的private方法不能访问)

2.编译器查看调用方法时提供的参数类型

如果在所有名为f的方法中存在一个与提供参数类型完全匹配的方法,就选择这个方法,这个过程叫做重载解析。例如,调用x.f("Hello")就会选择f(String)而不是f(int),如果没有找到与参数类型匹配的方法,或者发现经过类型转换后(int 可以转换成double,cat可以转换成animal)有多个方法与之匹配,则编译器报错

3.当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。

假设x的实际类型是D,它的父类是C,如果D类定义了f(String)那么该方法被调用(前提是父类有f(String)方法,所以说多态的必要条件之一是要有重写),否则就在D的父类中搜寻方法f(String),依次类推。(即可以理解为,动态绑定时,先检查父类中是否有f方法,若无则报错,若有,则检查其指向的子类中是否有f方法的重写,若有重写,则实现重写的方法,若无重写,则实现父类中的f方法

参考资料:

https://blog.csdn.net/tomcmd/article/details/48850413

http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html

 

 

 

你可能感兴趣的:(java)