“全栈2019”Java第五十四章:多态详解

128 阅读4分钟
原文链接: www.toutiao.com

难度

初级

学习时间

10分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.从继承开始

“全栈2019”Java第五十四章:多态详解

上面有三个形状,分别是圆形、正方形和长方形。分别用类来描述它们:

圆形(Circle类):

“全栈2019”Java第五十四章:多态详解

正方形(Square类):

“全栈2019”Java第五十四章:多态详解

长方形(Rectangle类):

“全栈2019”Java第五十四章:多态详解

再抽取公共部分,圆形、正方形、长方形都是形状,于是:

形状(Shape类):

“全栈2019”Java第五十四章:多态详解

圆形(Circle类):

“全栈2019”Java第五十四章:多态详解

正方形(Square类):

“全栈2019”Java第五十四章:多态详解

长方形(Rectangle类):

“全栈2019”Java第五十四章:多态详解

演示:

圆形、正方形和长方形类里面都有各自的绘制方法,我们想要绘制它们只需调用它们里面的绘制方法即可。下面请分别绘制圆形、正方形和长方形。

代码:

上述类不变。

Main类:

“全栈2019”Java第五十四章:多态详解

结果:

“全栈2019”Java第五十四章:多态详解

从运行结果来看,符合演示要求。程序也没有什么问题。但是我们Main类里面重载了很多绘制方法,原因是我绘制一个不同的形状就要添加一个draw方法,假如后面再来一个三角形,那么就要再编写一个重载方法draw,参数是三角形对象。这样的话程序会非常臃肿,阅读性也会下降。如果我们只写这样一个简单的方法,它只接收一个父类作为参数,而不是以子类作为接收参数,这样的话只要传递父类及其子类都可以,这个过程我们就称之为多态。

2.多态

改写Main类:

“全栈2019”Java第五十四章:多态详解

结果:

“全栈2019”Java第五十四章:多态详解

运行结果和上面小节的运行结果是一致的。

我们再来看一下Main里面的draw方法:

“全栈2019”Java第五十四章:多态详解

参数接收一个父类Shape,方法体里面执行调用父类Shape里面的draw方法。请问,为什么我传递父类及其子类都可以?为什么程序会分别调用各自子类图形的绘制方法而不是父类的图形绘制方法?

这里面涉及到方法调用绑定,一个叫静态绑定,还有一个叫动态绑定。下一章将着重讲解。

3.多态的应用

毋庸置疑,正是有了继承这一特性,才使得多态大放异彩。所以很多使用了继承的地方,都可以应用多态。

“全栈2019”Java第五十四章:多态详解

一只猫和一只狗,用类来描述它们,并抽取它们的公共部分。

演示:

用类描述猫和狗,并抽取他们的公共部分创建一个新类成为它们的父类。然后在Main类里面分别创建猫和狗的对象并创建方法去调用它们吃东西的方法。

代码:

Animal类:

“全栈2019”Java第五十四章:多态详解

Cat类:

“全栈2019”Java第五十四章:多态详解

Dog类:

“全栈2019”Java第五十四章:多态详解

Main类:

“全栈2019”Java第五十四章:多态详解

结果:

“全栈2019”Java第五十四章:多态详解

可以看到,结果还是正确的,只用了一个方法就完成了对猫和狗的吃东西方法调用。

多态内容还没结束,由于篇幅的原因,下一章我们将继续探讨有关多态更深的内容。

总结

  • 如果我们只写这样一个简单的方法,它只接收一个父类作为参数,而不是以子类作为接收参数,这样的话只要传递父类及其子类都可以,这个过程我们就称之为多态。

至此,Java中多态相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第五十三章:向上转型和向下转型详解

下一章

“全栈2019”Java第五十五章:方法的静态绑定和动态绑定详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java第五十四章:多态详解

版权声明

原创不易,未经允许不得转载!