4.多态
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多态
0.英语单词
1.为什么使用多态
1)问题的由来
需求变更
宠物系统中添加主人给宠物喂食功能,具体需求如下:
✧给Dog喂食,其健康值增加3,输出吃饱的信息
✧给Penguin喂食,其健康值增加5,输出吃饱的信息
分析
1)给抽象类Pet增加抽象方法eat()方法;
2)让Dog类重写Pet类的eat()方法,实现狗狗吃饭功能;
3)让Penguin类重写Pet类的eat()方法,实现企鹅吃饭功能
4)创建主人类Master,添加feed(Dog dog)方法,调用Dog类的eat()方法,实现狗狗的
喂养;添加feed(Penguin penguin)方法,调用Penguin类的eat()方法,实现企鹅的喂
养。
5)创建测试类Test,在类中创建主人、狗狗和企鹅对象,调用相应方法实现主人喂养
宠物的功能
实例1:Pet.java Dog.java Penguin.java Master.java Test.java
从实例的运行结果看,我们已经顺利实现了主人给宠物喂食的功能,但是,如果主人又领养了一只猫或更多的宠物,该如何实现给宠物喂食呢?
当然你可以添加一个Cat类,让其继承Pet类,重写eat()方法;然后在Master类中重载feed()方法,添加一个feed(Cat cat)方法。可是,如果添加更多的宠物呢,这样做的缺点是:代码频繁修改(每次都要修改Master类,添加feed()的重载方法),可扩展性、可维护性差(如果领养的宠物过多,Master类中就会有很多重载的feed()方法)。
2)怎么解决问题
如果能实现如下效果就好了:Master类中只有一个feed()方法,可以实现多有宠物的喂食,不管领养多少宠物,都不用修改Master类源码。
答案是肯定的,通过多态实现该效果。
2.什么是多态?
简单来说,多态(Polymorphism)是具有表现多种形态的能力的特征,更专业化的说法是:同一个引用类型(父类或接口相同),使用不同的实例而执行不同的操作。
生活案例1:花木兰替父从军
生活案例2:打印机
3.Java中如何实现多态
1)子类到父类的转换(向上转型)
将一个父类的引用指向一个子类对象,称为向上转型(upcasting),自动类型转换;
案例:类型转换Test2.java
2)使用父类作为方法形参实现多态
4.实现多态的条件
1)继承的存在,继承是多态的前提,没有继承就没有多态
2)子类重写父类的方法(多态下调用子类重写后的方法)
3)父类引用指向子类对象(子类到父类的转换或使用父类作为方法形参)
5.Java中使用多态应该注意的问题
1)通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。
2)通过父类引用变量无法调用子类特有的方法。
在第二点中,如果要调用子类特有的方法,需要使用多态的另外一个技能:父类到子类的转换,同时会使用instanceof运算符来判断类型的转换。将一个指向子类对象的父类引用赋值给一个子类的引用,称为向下类型转换,此时必须进行类型转换。
实例:classCastException
instanceof运算符对象instanceof 类或接口
实例:使用instanceof避免classCastException
注意:使用instanceof时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现编译错误。例如:pet instanceof String, 会出现编译错误。Instanceof通常和强制类型转换结合使用
6.作业
1)使用多态实现主人与宠物玩耍功能
主人和狗狗玩接飞盘的游戏,狗狗健康值减少10,亲密度增加5;主人和企鹅玩游戏,企鹅健康值减少10,亲密度增加5.实现主人和狗狗、企鹅玩耍的功能
实现思路
给Dog类添加catchFlyDisc()方法,实现接飞盘功能。
给Penguin类添加swim()方法,实现游泳功能。
给Master类添加play(Pet pet)方法,如果pet代表Dog就玩接飞盘;如果pet代表Penguin就玩游泳游戏。
创建测试类Test,在类中创建主人,狗狗和企鹅对象,调用相应的方法实现玩耍的功能。
注意编写注释
2)计算一次租赁多辆汽车的总租金。
上次作业中我们已经实现了汽车租赁系统的简单计价功能,客户可以租赁一辆某种型号的汽车若干天。现在增加业务需求:客户可以一次租赁多辆不同品牌的不同型号的汽车若干天(一个客户一次租赁的各汽车的租赁天数均相同),要求计算总租赁价。
实现思路:
✧在上次“汽车租赁系统计价功能”的基础上进行完善,可以复用该练习的代码;
✧创建顾客类Customer,提供calcTotalRent(MotoVehicle motos[], int days)方法,传入的参数
是客户租赁的汽车列表信息和租赁天数,在方法中调用相应汽车的calRent(int days)方法得到相应的租赁价格,求和计算出多辆汽车总租赁价格。
✧编写测试类TestRent,指定要租赁的多辆汽车信息,并存储在一个MotoVehicle类型数组
motos中,指定要租赁天数,调用Customer类的calcTotalRent(MotoVehicle moto[], int days)方法计算出总租赁价格并输出。
int[] array = new int[5];
MotoVehicle[] mvArray = new MotoVehicle[5];
class Customer{
Public int clcTotalRent(MotoVehicle motos[], int days){
Int sum =0;
For(int i =0 ; i Sum=sum+ Motos[i].calRent(days) } Return sum; } } class TestRent{ Public static void main(){ MotoVehicle motos[] = { New Car(“”,””), New Bus(“金杯”,”20”), } } }