About Me
欢迎各位读者访问,大家一起学习。
优秀是一种习惯♡♡♡
做更好的自己!
本人见识有限,写到博客难免有错误或疏忽的地方,还望各位大佬多多指点,在此表示感激不尽。♡♡♡
一 : 多态
1. 什么是多态?
例如:有一杯水,我不知道它是冷的还是热的,但是我一摸就知道。摸水杯这个动作可以当做一种行为,而水有冷水,有热水,有温水。对于水来说有多种不同的形态,我摸每一种水都会有不同的结果,这就是多态。
例如:打印机分为彩色打印机,和黑白打印机。彩色打印机打印出来的效果是彩色的,而黑白打印机打印出来的效果是黑白的。打印机就是一个接口,彩色打印机和黑白打印机是两个不同的实例。不同实例执行不同的操作,得到不同的效果。
-
多态性的表现是多种形式的
例如:电脑上F1这个按键,如果我在Word下按会弹出一个Word帮助,如果我安装截图软件Snipast后在按F1会启动截图这个功能,如果我在Windows下按就会弹出Windows的帮助和支持。
核心:同一种行为,发生在不同的对象,产生不同的结果。【按F1这个动作,在不同的对象上按,产生不同的结果】
2. 多态的必要条件?
-
继承
多态中必须存在子类继承父类,有继承关系。
-
重写
子类必须重写父类中允许访问的方法。
-
父类引用指向子类对象
多态的创建方式应该遵循:**左父右子**的方式,即左边是父类的对象引用指向右边子类对象。
代码理解:Animal a = new Dog();
/**
* @author Tornado
* @date 2021/11/6 11:04
*/
public class Test01 {
public static void main(String[] args) {
//父类的引用指向子类的对象
Animal a = new Dog();
a.eat();
}
}
//父类Animal
class Animal {
void eat() {
System.out.println("吃");
}
}
//Dog类继承Animal类
class Dog extends Animal {
//重写父类方法
@Override
void eat() {
System.out.println("狗吃");
}
}
打印结果:狗吃
核心:当使用多态的方式调用方法时,先检查父类中是否有这个方法,如果没有就会报错误,如果有则会去调用子类中的同名方法。
3. 多态实例
/**
* @author Tornado
* @date 2021/11/6 11:42
*/
public class Test02 {
public static void main(String[] args) {
//让Dog对象调用Show方法
show(new Dog());
//让Cat对象调用Show方法
show(new Cat());
//向上转型
Animal a = new Dog();
//调用Dog中的eat()方法
a.eat();
//向下转型
Dog d = (Dog) a;
//调用Dog中的Work方法
d.work();
}
//定义一个show方法【返回值:void 方法名:show 参数列表 Animal a】
public static void show(Animal a) {
a.eat();
//使用instanceof类型判断
if (a instanceof Cat) {
//猫做的事情
Cat c = (Cat) a;
c.work();
} else if (a instanceof Dog) {
//狗做的事情
Dog d = (Dog) a;
d.work();
}
}
}
//抽象类Animal
abstract class Animal {
abstract void eat();
}
//Dog类继承Animal并重写eat方法
class Dog extends Animal {
@Override
public void eat() {
System.out.println("吃骨头");
}
//Dog特有的方法
public void work() {
System.out.println("看门");
}
}
//Cat类继承Animal并重写eat方法
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
//work特有的方法
public void work() {
System.out.println("抓老鼠");
}
}
打印结果
吃骨头
看门
吃鱼
抓老鼠
吃骨头
看门
作用:用来判断对象是否属于某种数据类型【返回类型:布尔类型】
4. 多态转型
-
向上转型
多态本身就是向上转型,向上转型是自动的 Animal an = new Dog();
使用格式:父类类型 变量名 = new 子类类型();
适用场景:当不需要使用子类类型时,提高扩展性。
-
向下转型
将父类对象转换为子类对象,向下转型要强转 Dog g = (Dog) an;
使用格式:子类类型 变量名 = (子类类型)父类变量名;
适用场景:当需要使用子类的特有方法时
5. 多态的优点
6. 多态实现方式
不要在最能吃苦的年纪选择了安逸!!! — Tornado♥