2021/08/20 JavaOop 第三章 多态

1.什么是多态?

一种事物(方法丶类丶对象等等) 多种状态

多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。

2.多态有什么好处?

  ①:应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。        //继承

  ②:派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。                   //多态的真正作用

3.多态存在的三个必要条件:

        一、要有继承;

        二、要有重写;

        三、父类引用指向子类对象。

        Java中多态的实现方式:

                接口实现

                继承父类进行方法重写

                同一个类中进行方法重载

                方法表与方法调用

Java 的方法调用有两类,动态方法调用与静态方法调用。静态方法调用是指对于类的静态方法的调用方式,是静态绑定的;而动态方法调用需要有方法调用所作用的对象,是动态绑定的。类调用 (invokestatic) 是在编译时刻就已经确定好具体调用方法的情况,而实例调用 (invokevirtual) 则是在调用的时候才确定具体的调用方法,这就是动态绑定,也是多态要解决的核心问题。

方法表是动态调用的核心,也是 Java 实现动态调用的主要方式。它被存储于方法区中的类型信息,包含有该类型所定义的所有方法及指向这些方法代码的指针,注意这些具体的方法代码可能是被覆写的方法,也可能是继承自基类的方法。
 

4.多态的应用场景

        多态的常用应用场景:

                ①:参数

                ②:返回值

        多态的其他应用场景:

                ③:子类对象new出来赋值给父类        父类引用子类对象

                ④:向上转型        子转父对象

                ⑤:向下转型        父转子对象

5.向上转型与向下转型的区别

                        Animal是Cat和Dog的父类并子类重写了父类的方法

        向上转型:

                //在调用父类方法的时候,会优先寻找自己重写后的方法执行

                //向上转型的对象无法拥有子类自己的方法

                //本质还是转成了父类 Animal Animal c=new Cat();

                c.eat(); //运行子类重写的吃方法

                c.walk(); //运行父类的睡觉方法

                // c.sleep(); 无法拿到子类自己的方法

        向下转型:

                //向上转型 是自动的 没问题的

                //但是向下转型 一定要注意 符不符合要求

                //向下转型在调用父类方法的时候,也会优先寻找自己重写后的方法执行

                //向下转型转换的对象必须是子转父且对应的对象

                //向下转型的对象拥有父类子类所有的方法

                Animal a=new Dog();

                Dog d=(Dog)a;

                d.eat(); //运行子类重写的吃方法

                d.sleep(); //运行子类自己的睡觉方法

                d.walk(); //运行父类的睡觉方法

                //掌握父类和子类之间的类型转换

                //向上转型(子转父):自动

               //向下转型(父转子):强转

6.instanceof关键字

        public class Master {

                //...省略属性

                //方法重载

                //传入Animal以及子类

                //子类转型为父类对象 作为参数传入

                //使得同一个方法 在不同场景下表现出多种状态

                        public void feed(Animal a){

                //实现狗吃骨头猫吃鱼

                //用instanseof判断a对象是狗还是猫

                                if(a instanceof Dog){

                                         System.out.println("喂狗吃骨头!");

                                }else if(a instanceof Cat){

                                        System.out.println("喂猫吃鱼!");

                                }

                }

}

练习小作业:

        1.继续完善奥特曼打小怪兽

                        完善游戏结束机制,并且输出提示胜利方

                        加入暴击丶回血机制

                        R技能 大招

        2.使用继承 多态完善奥特曼打小怪兽

                        大家发现奥特曼跟小怪兽很多属性 方法简直一模一样

                        所以必然可以用继承体系来简化

                        多态也可介入其中 子类传入当父类。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abcdzzr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值