关于重载与多态的深刻反省

2019-10-25 07:13:15来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

关于重载与多态的深刻反省

  有时候,人在长时间重复盯着一个汉字或者一个单词时,会突然发生不认识该字或者单词的情况,这是一种神经心理学现象,被称为“语义饱和”或者“完形崩坏”。有时候,人在长时间不复习一个名词或者一个概念的时,会突然发生不理解该名词或者概念的情况,这是一种认知心理学现象,被称为“基础不牢固”或者“学习不认真”。

  就像一提到重载和多态。你问我什么是重载?我唰唰两下背出来:重载,编译时多态,主要是指同一个类里同名方法具有不同的参数列表(参数类型、参数数目、参数次序),且不能通过返回值判断是否重载顺带买一送一:多态,分为编译时多态与运行时多态,指同一种行为具有多种不同表现形式或形态的能力。其中编译时多态表现形式为方法重载(overload),运行时多态表现形式为方法重写(override)。实现多态必要条件是:① 继承 ②重写 ③父类引用指向子类对象。

  看似好像没啥不对,可突然我发现,编译时多态不满足多态必要条件,也就是说编译时多态不是多态?这可把我整懵了。为此必须得纠结一会重载是不是多态的概念问题。

 

多态

  关于定义:

   在维基百科里,多态是这么定义的:

    在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口

 

    也就是说多态是面向接口编程多态性使我们能够以不同的方式执行单个动作。换句话说,多态允许我们定义一个接口并具有多种实现。

 

   关于多态分类:

    子类型多态(inclusion polymorphism):...子程序编写为可在超类型的元素上操作的函数或函数也可以在子类型的元素上操作...也被称为包含多态(Subtype polymorphism)。在面向对象程序设计中,这被直接称为多态

    参数多态性Parametric polymorphism):...由于这种关联处理于编译期而非运行期,因此被称为“静态”。...参数多态性在几种面向对象的语言中也可用。例如Java中的泛型名称....

    临时多态(Ad hoc polymorphism):...把类型作为参数的多态...但是其行为取决于所应用自变量的类型(也称为函数重载运算符重载)...

    强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。

 

   总的来说:

      • 子类型多态也称为运行时多态,面向对象中的多态。
      • 参数多态性是把类型作为参数的多态泛型
      • 临时多态性取决于应用自变量的类型,即重载
      • 强制多态也称为(隐式或显式)强制转换,当没有符合的方法,则将类型尽可能的进行转换。

    其中参数多态和临时多态都是静态绑定,即在编译时能确定调用哪个方法,为静态多态;子类型多态和强制多态是动态绑定,即运行时才能确定具体调用哪个方法,为动态多态。


(相关例子待补充)

(相关例子待补充)

(相关例子待补充)


 

 

  至此应该搞清楚了多态和重载之间的关系了:

     多态分为编译时多态和运行时多态,在面向对象编程里的多态一般指子类型多态,即要满足① 继承 ②重写 ③父类引用指向子类对象

     而重载则是多态表现形式的一种,即临时多态。

     可以说重载是编译时多态,而不能说编译时多态是重载,因为编译时多态还包括泛型。

 

 

 

参考资料:https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

     https://zh.wikipedia.org/wiki/%E5%A4%9A%E5%9E%8B_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)

 


原文链接:https://www.cnblogs.com/chiayhon/p/11736004.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:使用SpringBoot AOP 记录操作日志、异常日志

下一篇:java基础系列(一):Number,Character和String类及操作