1、引言
封装、继承、多态,是面向对象语言的基本特性。
封装,就是就将一些属性使用private访问修饰限定符封闭在类中,提供公开的接口供外部类使用
继承,在前面的文章中也做了详细的介绍(多态须用到继承,未掌握继承需要先去看博主所写的继承文章~)
而多态是什么呢?让我们带着疑问往下阅读~
2、什么是多态
通俗来讲,多态就是不同的对象来完成一个相同的动作时,会表现出不同的行为形态,这就叫做多态。
举一个例子:
在买火车票的过程中,乘客都有买票的动作,但是不同的乘客买票的方式可能有差异:
成人:全票
学生:半价
军人:免费
以及如下图所示的例子:
总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。
2.1 多态实现的条件
如果要实现多态,那么以下这几个条件是必不可少的:
1、在继承体系下
2、实现向上转型
3、重写相关方法
4、通过父类引用调用重写方法
5、发生动态绑定
3、向上转型
父类的引用,引用的是子类对象,这就是向上转型。
向上转型有三种形式,
接下来我会一一为大家讲解,首先我们先利用继承定义三个类(一个父类两个子类):
1. 直接赋值
我们通过将实例出的子类直接赋值给父类引用来实现向上转型。
2. 方法的传参
我们将子类对象的引用为实参,传入方法中,形参用父类对象的引用接收,这样也实现了向上转型。
3. 返回值
我们在方法中返回一个子类的对象,用父类的引用接收,这样也可以实现向上转型。
3.1 向上转型的注意事项
向上转型后,父类对象的引用只能调用父类自己的成员,子类特有的方法是不能直接调用的:
(这也是向上转型的缺点)
3.2 向下转型
向下转型在多态中使用不到,也是不安全的,很少用到,这里可以做简单了解。
将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转型。
在这里我们进行代码展示:
4、重写
想要完成多态,重写是一个必不可少的条件。
4.1 什么是重写
如果子类的一个方法和父类的方法:
1.方法名相同
2.返回值相同
3.参数列表相同【个数、类型、顺序】
那么,我们就说子类重写了父类的那个方法(重写一说覆写、覆盖)
代码演示:
4.2 重写的注意事项
相信大家通过前面的介绍,已经理解了重写。
那我们再来看看关于重写的一些注意事项:
1.静态的方法不能被重写
2.被final修饰的方法不能被重写
3.被private修饰的方法不能被修饰
4.重写后的方法的访问修饰限定符的权限必须大于等于那个被重写的方法的访问权限(如果子类重写父类的方法,那么子类的方法的权限必须大于等于父类的方法的权限)
也就是说,
如果父类方法的权限是默认包访问权限,子类可以是默认包、protected、public
如果父类方法的权限是public,那么子类只能是public
5.重写后的方法的返回值必须与父类的返回值相同,除非构成父子类关系
4.3 重写和重载的区别(面试问题)
前面的文章中已经说过了重载,好像跟重写是有些类似的,那么重载和重写的区别是什么呢?这可是一个面试问题,大家要画重点哦!
相同点:
1.方法名都要求相同
不同点:
1.【重写】 参数列表必须相同
2.【重载】参数列表必须不同
3.【重写】 返回值必须相同或构成父子类关系
4.【重载】 返回值不做要求
5.【重写】重写后的权限必须大于等于父类中的
6.【重载】权限不做要求
(访问修饰限定符表):
5、动态绑定
我们前面说有,向上转型后,父类的引用只能调用父类特有的方法
那,当我们通过父类引用调用被重写的方法后,到底是调用父类的方法呢?还是调用子类中重写的那个方法呢?让我们一起来揭开这个谜团:
我们通过代码运行,发现调用的是子类中重写的方法,可是这是为什么呢?按理来说,父类的引用应该调用的是他父类自己的方法啊?
-------这是因为,在调用方法运行的时候,发生了动态绑定。
5.2 什么是动态绑定
通过父类的引用,调用父类和子类重写的那个方法,当代码运行的时候,结果实际调用的是子类重写的那个方法,我们把这个情况就叫做:动态绑定!!!
相信大家到这里已经发现了动态绑定有一个大前提,那就是:在继承的前提下!!!
6、多态的实现
到这里,我们理解了继承、向上转型、动态绑定、重写后,那么实现多态就很简单了。
基于以上代码,我们定义了Animal父类,以及Dog和Cat两个子类,我们通过方法传参来向上转型(实参是子类对象,形参用父类引用来接收),在方法中调用重写的方法,我们可以发现,一个引用引用不同的对象,调用一个相同的重写的方法,所展现出的效果(形态)就不一样,这就是多态!多态就是在继承体系中,同一个方法能完成不同功能(展示出不同的形态)!!!
OK~本次博客到这里就结束了,
感谢大家的阅读~欢迎大家在评论区交流问题~
如果博客出现错误可以提在评论区~
创作不易,请大家多多支持~