我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:彩库宝典 > 动多态 >

java 多态与动态绑定的理解

归档日期:07-04       文本归类:动多态      文章编辑:爱尚语录

  :封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。

  :指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

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

  上述的概念似乎并不清楚,并且也无助于理解多态这样一个概念。结尾我们将进行上述问题的详细解析。

  在Parent的引用下调用同一个方法,不同的子类实例就会产生不同的方法表现,是比较直观的多态体现。

  按照搜索结果,我们可以得知,override_method的调用过程体现了动态绑定的概念。

  即一个对象的方法定义唯一辨识包含两部分:方法名和参数列表。它们共同组成一个方法的唯一标识。

  overload:同一个类中方法名相同,但是参数列表不同的方法定义称为方法重载(overload)

  override: 与超类中的方法名,参数列表完全相同的子类中的方法定义称为覆盖(override)

  ps: 如果子类中的方法定义仅仅是方法名与超类中的方法相同,则并不会覆盖超类中的方法实现。其效果类似于方法重载的结果。

  1.假设x声明为C类的对象,即C x = new C(); 调用x.f(参数p),那么编译器将会一一列举所有C类中名为f的方法和C的超类中访问属性为public且名为f且未被C中的f覆盖的方法。

  2.接下来,编译器进行调用方法时提供的参数列表的检查,如果所有名为f的方法中存在完全匹配的参数类型,那么就选择这个方法,这个过程称为重载解析,然而可能存在并没有完全匹配的参数类型的情况,编译器将对传入的参数进行类型转换,如int可以转成double,子类转成父类(此行为将会检索整个向上的继承链)。如果进行转换后没有匹配的,或者发现经过转换后有多个方法与之匹配,则会发生错误。

  3.采用动态绑定调用方法时,虚拟机一定调用的是x所引用对象的实际类型最合适的那个类的方法。举个栗子:Class D extends C, C x = new D(); 进行x.f(String)调用,那么首先如果D中定义了f(String)那么直接调用D中的f(String),如果D中没有定义,那么将在超类C中寻找f(String),如果还没有找到,依次类推向上搜索整个继承链。

  4.有动态绑定,那么对应的就有静态绑定:所有private、static、final方法或者constructor方法都是编译器能够准确知道调用的是哪一个方法,称之为static binding。

  声明引用的类型为A,实际对象类型也是A,参数列表为 B 类型,包含show方法为show(D),show(A),此时没有完全匹配调用show(B)的,进行传入参数的类型向上转换,B的超类为A,传入参数列表中的B转换为A,匹配show(A),调用show(A)

  声明引用的类型为A,实际对象类型也是A,参数列表为 C 类型,包含show方法为show(D),show(A),此时没有完全匹配调用show(C)的,进行传入参数的类型向上转换,C的超类为B,B并无匹配项,继续向上转换得到A,传入参数列表中的B转换为A,匹配show(A),调用show(A).

  声明引用为B,实际类型为b,调用的方法为show(B),直接调用B.show(B)

  声明引用为B,实际类型为b,调用的方法为show(C),B和超类A中无方法匹配,C向上转换为B,匹配B.show(B)

  声明引用为B,实际类型为b,调用的方法为show(D),B中方法无匹配,但B的超类A中匹配方法a.show(D)

本文链接:http://dalezaragoza.com/dongduotai/584.html