📚 Java-继承与多态-上篇:———— <Java-继承与多态-上篇-优快云博客>
📕 继承的概念与使用
📕 父类成员访问
📕 super关键字
📕 super 与 this 的区别
📕 子类构造方法
📕 继承方式
📕 final 关键字
📚 Java-继承与多态-下篇:———— <就是本篇>
📕 多态的概念
📕 多态的实现条件
📕 重写
📕 向上/向下转型
一、多态的概念
多态多态,其意如其名,也就是"多种形态"。
📌 具体一点来说就是:
📚 对象有多种多样,而相同的一个行为,由不同的对象去完成,就会有不同的结果。
通过这张图片来看,大家应该就能更形象的了解"多态"的含义。
很多对象都拥有"游泳"和"进食"的行为,但青蛙的游泳就是"蛙泳",狗的游泳就是"狗刨";猫的进食就是"吃猫粮",狗的进食就是"吃狗粮"。
总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。
二、多态的实现条件
📌 想要实现像上面那样,一个方法在不同对象使用时产生不同效果,需要的条件是:
📕 必须在继承体系下
📕 子类必须要对父类中方法进行重写
📕 通过父类的引用调用重写的方法
📚 那么接下来我们通过一段代码来举例说明一下:
Animal类:
class Animal {
public void sound() {
System.out.println("动物发出声音");
}
}
Dog类:
class Dog extends Animal {
@Override
public void sound() {
System.out.println("汪汪汪");
}
}
Cat类:
class Cat extends Animal {
@Override
public void sound() {
System.out.println("喵喵喵");
}
}
好啦,一个父类和两个子类都写好了,让我们回到Main中:
这就是"方法的重写",就是"多态"。
三、重写
重写,也被称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写:
📌 需要注意的是:
📕 返回值和形参都不能改变!否则不能叫做重写!
📕 重写可以根据子类需要,定义特定于自己的行为
📚 方法重写的规则:
📕 子类在重写父类方法时,必须与父类方法原型一致:
📕 被重写的方法返回值类型可以不同,但是必须是具有父子关系的:
📕 访问权限不能比父类中被重写的方法的访问权限更低:
📕 父类被static、private修饰的方法、构造方法都不能被重写。
而在初次学习重写时,会有很多老铁把重写和重载搞混,其实两者的差别还是很大的!
📌 重写和重载的区别:
区别点 | 重写 | 重载 |
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 一定不能修改(除非是父子关系) | 可以修改 |
访问限定符 | 不能比父类中被重写的方法的访问权限更低 | 可以修改 |
📚 两者之间最本质的区别就是:
重写是 "覆盖" ,相当于把该方法稍加改动,然后在一定范围内代替了旧的方法。
重载是"创建",是创建出一个新的方法。
四、向上/向下转型
① 向上转型
顾名思义,就是创建一个子类对象,然后把他当成他的父类对象来进行使用,指将子类的对象赋值给父类类型的变量。这种转型是自动进行的,不需要显式地进行类型转换。
📌 向上转型的特点:
📕 子类对象可以自动转型为父类类型:
📕 父类类型的变量可以引用子类对象:
📕 子类对象继承了父类的属性和方法,通过父类类型的变量可以调用父类中定义的方法:
📕 父类类型的变量无法调用子类中特有的方法和属性:
📌 向上转型的优点:让代码实现更简单灵活。
📌 向上转型的缺点:不能调用到子类特有的方法。
② 向下转型
向下转型,顾名思义是指将父类类型的变量转换为子类类型的变量。这种转型需要显式地进行,并且需要在编译时进行类型检查和运行时进行类型转换。
(注意:与向上转型不同,向下转型需要显式的进行,而并非自动转换)
向下转型与向上转型还是有一些不一样的:
📌 向下转型的特点:
📕 父类类型的变量需要先向上转型为子类类型的变量,然后才能进行向下转型:
📕 父类类型变量向下转型成子类类型变量后,可以使用子类独有方法:
📌 需要注意的是:
有时当转型次数过多,或父类子类等对象关系稍微繁琐,可能就会出现向下转型失败的情况,而为了提高使用"向下转型"的安全性,我们可以这样写:
那么这篇关于(继承与多态-下篇)的知识,就暂时为大家分享到这里啦,作者能力有限,如果有哪里说的不够清楚或者不够简洁,还请大家在评论区多多指出,那么我们下期再见啦~