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.使用继承 多态完善奥特曼打小怪兽
大家发现奥特曼跟小怪兽很多属性 方法简直一模一样
所以必然可以用继承体系来简化
多态也可介入其中 子类传入当父类。。。