详细认识多态

About Me

欢迎各位读者访问,大家一起学习。

优秀是一种习惯♡♡♡

做更好的自己!

本人见识有限,写到博客难免有错误或疏忽的地方,还望各位大佬多多指点,在此表示感激不尽。♡♡♡


一 : 多态

1. 什么是多态?

  • 是同一种行为具有多种不同的表现形式或形态的能力。

例如:有一杯水,我不知道它是冷的还是热的,但是我一摸就知道。摸水杯这个动作可以当做一种行为,而水有冷水,有热水,有温水。对于水来说有多种不同的形态,我摸每一种水都会有不同的结果,这就是多态。

  • 是同一个接口,使用不同的实例而执行不同的操作。

例如:打印机分为彩色打印机,和黑白打印机。彩色打印机打印出来的效果是彩色的,而黑白打印机打印出来的效果是黑白的。打印机就是一个接口,彩色打印机和黑白打印机是两个不同的实例。不同实例执行不同的操作,得到不同的效果。

image-20211106104407246

  • 多态性的表现是多种形式的

    例如:电脑上F1这个按键,如果我在Word下按会弹出一个Word帮助,如果我安装截图软件Snipast后在按F1会启动截图这个功能,如果我在Windows下按就会弹出Windows的帮助和支持。

    核心同一种行为,发生在不同的对象,产生不同的结果。【按F1这个动作,在不同的对象上按,产生不同的结果】

2. 多态的必要条件?

  1. 继承

    多态中必须存在子类继承父类,有继承关系

  2. 重写

    子类必须重写父类中允许访问的方法。

  3. 父类引用指向子类对象

    多态的创建方式应该遵循:**左父右子**的方式,即左边是父类的对象引用指向右边子类对象。

代码理解: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("抓老鼠");
    }
}

打印结果

吃骨头
看门
吃鱼
抓老鼠
吃骨头
看门
  • instanceof关键字

作用:用来判断对象是否属于某种数据类型【返回类型:布尔类型】

4. 多态转型

  1. 向上转型

    多态本身就是向上转型,向上转型是自动的 Animal an = new Dog();

    使用格式:父类类型 变量名 = new 子类类型();
    适用场景:当不需要使用子类类型时,提高扩展性。
  2. 向下转型

    将父类对象转换为子类对象,向下转型要强转 Dog g = (Dog) an;

    使用格式:子类类型 变量名 = (子类类型)父类变量名;
    适用场景:当需要使用子类的特有方法时

5. 多态的优点

  1. 消除类型之间的耦合性
  2. 可替换性
  3. 可扩展性
  4. 接口性
  5. 灵活性
  6. 简化性

6. 多态实现方式

  1. 编译时多态
    1. **编译期间**决定目标方法

    2. 通过overloading重载实现

    3. 方法名相同,参数不同

  2. 运行时多态
    1. **运行期间**决定目标方法
    2. 同名同参
    3. overriding和继承实现

image-20211106195829580

                                                      不要在最能吃苦的年纪选择了安逸!!!        — Tornado♥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值