不同宠物吃的东西不一样,狗吃骨头,企鹅吃鱼
不同宠物恢复后体力值不一样
狗狗类增加狗狗吃食的方法
企鹅类增加企鹅吃食的方法
创建主人类编写给狗狗喂食的方法编写给企鹅喂食的方法
编写测试方法调用主人类给狗狗喂的方法调用主人类给企鹅喂的方法
宠物父类
publicabstractclassPet{ privateStringname="无名氏";//昵称 privateinthealth=100;//健康值 privateintlove=0;//亲密度 /** *抽象方法eat(),负责宠物吃饭功能。 */ publicabstractvoideat(); /** *有参构造方法。 *@paramname昵称 */ publicPet(){ } publicPet(Stringname){ this.name=name; } publicvoidsetName(Stringname){ this.name=name; } publicvoidsetHealth(inthealth){ this.health=health; } publicvoidsetLove(intlove){ this.love=love; } publicStringgetName(){ returnname; } publicintgetHealth(){ returnhealth; } publicintgetLove(){ returnlove; } /** *输出宠物信息。 */ publicvoidprint(){ System.out.println("宠物的自白:\n我的名字叫"+this.name+ ",健康值是" +this.health+",和主人的亲密度是" +this.love+"。"); } }狗类
publicclassDogextendsPet{ privateStringstrain;//品种 /** *有参构造方法。 *@paramname昵称 *@paramstrain品种 */ publicDog(Stringname,Stringstrain){ super(name); this.strain=strain; } publicStringgetStrain(){ returnstrain; } /** *重写父类的print方法。 */ publicvoidprint(){ super.print();//调用父类的print方法 System.out.println("我是一只"+this.strain+"。"); } /** *实现吃食方法。 */ publicvoideat(){ if(getHealth()>=100){ System.out.println("狗狗"+this.getName()+"吃饱了,不需要喂食了!"); }else{ this.setHealth(this.getHealth()+3); System.out.println("狗狗"+this.getName()+"吃饱啦!健康值增加3。"); } }}企鹅类
publicclassPenguinextendsPet{ privateStringsex;//性别 /** *有参构造方法。 *@paramname昵称 *@paramsex性别 */ publicPenguin(Stringname,Stringsex){ super(name); this.sex=sex; } publicStringgetSex(){ returnsex; } /** *重写父类的print方法。 */ publicvoidprint(){ super.print(); System.out.println("性别是"+this.sex+"。"); } /** *实现吃食方法。 */ publicvoideat(){ if(getHealth()>=100){ System.out.println("企鹅"+this.getName()+"吃饱了,不需要喂食了!"); }else{ this.setHealth(this.getHealth()+5); System.out.println("企鹅"+this.getName()+"吃饱啦!健康值增加3。"); } }}主人类
publicclassMaster{ privateStringname="";//主人名字 privateintmoney=0;//元宝数 /** *有参构造方法。 *@paramname主人名字 *@parammoney元宝数 */ publicMaster(Stringname,intmoney){ this.name=name; this.money=money; } publicvoidsetName(Stringname){ this.name=name; } publicvoidsetMoney(intmoney){ this.money=money; } publicintgetMoney(){ returnmoney; } publicStringgetName(){ returnname; } /** *主人给Dog喂食。 */ publicvoidfeed(Dogdog){ dog.eat(); } /** *主人给Penguin喂食。 */ publicvoidfeed(Penguinpgn){ pgn.eat(); }}测试类
publicclassTest{ publicstaticvoidmain(String[]args){ Dogdog=newDog("欧欧","雪娜瑞"); dog.setHealth(80);//设置健康值,以便正常喂食 Penguinpgn=newPenguin("楠楠","Q妹"); Mastermaster=newMaster("王先生",100); master.feed(dog);//主人给狗狗喂食 master.feed(pgn);//主人给企鹅喂食 pgn.setHealth(80);//设置健康值,以便正常喂食 master.feed(pgn);//主人再次给企鹅喂食 }}如果再领养新种类XXX的宠物,就需要给XXX喂食,怎么办?添加XXX类,继承Pet类,实现吃食方法修改Master类,添加给XXX喂食的方法publicclassMaster{publicvoidfeed(Dogdog){dog.eat();} publicvoidfeed(Penguinpgn){pgn.eat();} publicvoidfeed(XXXxxx){xxx.eat();}……}频繁修改代码,代码可扩展性、可维护性差,如何优化?使用多态优化设计
参数都是Pet类的子类可否使用一个feed(Petpet)实现对所有宠物的喂食?
多态:同一个引用类型,使用不同的实例而执行不同操作
使用多态实现思路
使用父类作为方法形参实现多态
使用多态优化主人给宠物喂食
publicclassMaster{//使用父类作为方法形参publicvoidfeed(Petpet){pet.eat();}}测试类的改变
Petpet=newDog();Mastermaster=newMaster();master.feed(pet);//同一种操作方式,不同的操作对象练习使用多态实现喂养宠物功能增加宠物猫并喂食,其健康值增加4
在继承章节汽车租赁系统的基础上,实现计算多种车辆总租金的功能现在有客户租用2辆宝马1辆别克商务舱1辆金龙(34)座租5天共多少租金?
1、创建车的对象,放在数组中
MotoVehile[]motos=newMotoVehile[4];motos[0]=newCar("宝马550i","京NY28588");motos[1]=newCar("宝马550i","京NNN328");motos[2]=newCar("别克林荫大道","京NY28588");motos[3]=newBus("金龙",34);2循环调用calcRent()方法,计算总租金
publicintcalcTotalRent(MotoVehile[]motos,intdays){inttotalRent=0;for(inti=0;i 1.创建卡车类,实现calcRent()方法2.修改统计租金代码 publicabstractclassMotoVehicle{privateStringno;//车牌号privateStringbrand;//品牌abstractintcalRent(intdays);//计算租金publicMotoVehicle(){}publicMotoVehicle(Stringno,Stringbrand){this.no=no;this.brand=brand;}publicStringgetNo(){returnno;}publicvoidsetNo(Stringno){this.no=no;}publicStringgetBrand(){returnbrand;}publicvoidsetBrand(Stringbrand){this.brand=brand;}}publicclassCarextendsMotoVehicle{publicCar(Stringno,Stringbrand){super(no,brand);}@OverrideintcalRent(intdays){if(getBrand().equals("宝马")){return500*days;}else{return600*days;}}}publicclassKacheextendsMotoVehicle{privateintdunwei;//吨位publicKache(intdunwei){this.dunwei=dunwei;}@OverrideintcalRent(intdays){return50*dunwei*days;}}不用多态的实现方式 Car[]cars=newCar[3];cars[0]=newCar("辽A12345","宝马");cars[1]=newCar("辽B22222","别克");cars[2]=newCar("辽A62222","奔驰");Kache[]kaches=newKache[2];kaches[0]=newKache(1);//150kaches[1]=newKache(4);//600inttotal=0;for(inti=0;i