资源预览内容
第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
第9页 / 共49页
第10页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
JAVA核心逻辑核心逻辑第七章第七章:封装、继承、多态封装、继承、多态目录目录?封装的概念封装的概念继承的概念继承的概念访问修饰符访问修饰符方法的覆盖方法的覆盖(Override)super关键字关键字多态的概念多态的概念强制类型转换与强制类型转换与instanceof关键字关键字为什么要使用封装为什么要使用封装?下面代码有何缺陷?下面代码有何缺陷?Consumer cons = new Consumer();cons.age = -1000; 属性随意访问,不合理的赋值属性随意访问,不合理的赋值使用封装使用封装封装的概念封装的概念?什么是封装什么是封装?将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问通过该类提供的方法来实现对隐藏信息的操作和访问?封装的好处封装的好处隐藏类的实现细节隐藏类的实现细节只能通过规定方法访问数据只能通过规定方法访问数据方便加入控制语句方便加入控制语句方便修改实现方便修改实现使用封装使用封装?封装步骤封装步骤1修改属性的可见性修改属性的可见性设为设为private2创建公有的创建公有的getter/setter方法方法用于属性的读写用于属性的读写3在在getter/setter方法中加方法中加入属性控制语句入属性控制语句对属性值的合法对属性值的合法性进行判断性进行判断使用封装使用封装使用封装使用封装输出结果:输出结果:100.0封装练习封装练习?需求说明需求说明?使用封装描述宠物信息,小猫和企鹅使用封装描述宠物信息,小猫和企鹅小猫:昵称、健康值、亲密度、种类和自身信息显示小猫:昵称、健康值、亲密度、种类和自身信息显示企鹅:昵称、健康值、亲密度、性别和自身信息显示企鹅:昵称、健康值、亲密度、性别和自身信息显示为什么使用继承为什么使用继承?分析代码分析代码Dog- name:String- health:int- love:int- strain:String+ print():void+ getName():String+ getHealth ():int+ getLove():int+ getStrain:String+ Dog()Penguin- name:String- health:int- love:int- sex:String+ print():void+ getName():String+ getHealth ():int+ getLove():int+ getSex():String+ Penguin()使用继承优化设计使用继承优化设计将重复代码将重复代码抽取到父类中抽取到父类中为什么使用继承为什么使用继承?使用继承后使用继承后方便修改代码方便修改代码减少代码量减少代码量子类与父类是子类与父类是is-a关系关系继承继承?继承关键字继承关键字?extends?示例示例?编写父类编写父类只能继承一个父类只能继承一个父类class Pet /公共的属性和方法公共的属性和方法?子类继承子类继承class Dog extendsPet /子类特有的属性和方法子类特有的属性和方法使用继承使用继承?子类访问父类成员子类访问父类成员?访问父类构造方法访问父类构造方法super ();super (name);?访问父类属性访问父类属性super.name;?访问父类方法访问父类方法super.print();使用使用super关键字关键字,super代表父类对象代表父类对象在子类构造方法中调用且在子类构造方法中调用且必须是第一句必须是第一句小结小结?java中的继承的特点中的继承的特点?单继承单继承?java中单继承的好处中单继承的好处?代码复用代码复用利于维护利于维护?使用场合使用场合?符合符合is-a关系关系需要解决代码重复需要解决代码重复理解继承理解继承?Dog类类 extends Animal类类AnimalsexageDog call()?对象的创建:对象的创建:?new Dog();分配空间分配空间 (父类对象空间,子类对象空间)(父类对象空间,子类对象空间)?递归的构造父类对象递归的构造父类对象初始化属性初始化属性调用构造方法调用构造方法Java中的访问修饰符中的访问修饰符?java中的访问修饰符中的访问修饰符方法的覆盖方法的覆盖(Override)?使用继承后效果使用继承后效果调用父类的调用父类的print()方法,方法,不能显示不能显示Dog的的strain信信息和息和Peguin的的sex信息信息?如何实现如下效果呢?如何实现如下效果呢?子类重写父类方法子类重写父类方法方法的覆盖方法的覆盖(Override)?方法重写的规则方法重写的规则?方法名相同方法名相同参数列表相同参数列表相同?返回值类型相同或者是其子类;返回值类型相同或者是其子类;访问权限不能严于父类访问权限不能严于父类?方法重载与方法重写方法重载与方法重写方法名方法名方法重写方法重写方法重载方法重载相同相同相同相同参数表参数表相同相同不相同不相同返回值返回值相同或是相同或是其子类其子类无关无关访问修饰符访问修饰符不能比父类更不能比父类更严格严格无关无关继承练习继承练习?需求说明需求说明?优化描述宠物信息的功能优化描述宠物信息的功能使用继承实现使用继承实现Dog类和类和Penguin类类?打印宠物信息打印宠物信息super()思考题思考题super()总结总结?每一个子类的构造方法在没有显示调用每一个子类的构造方法在没有显示调用super()系统都会系统都会提供一个默认的提供一个默认的super()super() 书写在第一行书写在第一行?可以在子类构造方法中显示调用可以在子类构造方法中显示调用super(),完成对特定父类完成对特定父类构造方法的调用构造方法的调用?super不能访问父类的不能访问父类的private成员成员抽象类抽象类?问题:实例化问题:实例化Pet是否的意义是否的意义 ?Pet pet = new Pet ( 贝贝贝贝,20,40);pet.print();?Java中使用抽象类,限制实例化中使用抽象类,限制实例化publicabstract class Pet ?abstract也可用于方法也可用于方法抽象方法抽象方法?抽象方法没有方法体抽象方法没有方法体抽象方法必须在抽象类里抽象方法必须在抽象类里publicabstractvoid print();抽象方法必须在子类中被实现,除非子类是抽象类抽象方法必须在子类中被实现,除非子类是抽象类抽象类练习抽象类练习?需求说明:需求说明:?修改修改Pet类为抽象类类为抽象类修改修改Pet类的类的print()方法为抽象方法方法为抽象方法输出输出Dog信息信息抽象类的特点抽象类的特点?抽象类可以用于声明,但不允许创建对象抽象类可以用于声明,但不允许创建对象?抽象类可以被子类继承,从而创建子类对象抽象类可以被子类继承,从而创建子类对象抽象方法的特点抽象方法的特点?拥有抽象方法的类必须是抽象类拥有抽象方法的类必须是抽象类抽象方法的特点抽象方法的特点?抽象方法由子类实现抽象方法由子类实现非抽象类继承抽象非抽象类继承抽象类,必须实现父类类,必须实现父类的所有抽象方法的所有抽象方法抽象的作用抽象的作用?抽取共性抽取共性抽象的作用抽象的作用?不同实现不同实现抽象的作用抽象的作用?抽象类是更高层次的抽象抽象类是更高层次的抽象综合练习综合练习?需求说明需求说明?编写程序实现计算租赁价编写程序实现计算租赁价某汽车租赁公司出租多种车辆,车型及租金情况如下:某汽车租赁公司出租多种车辆,车型及租金情况如下:轿车轿车车型车型日租费日租费(元元/天天)别克商务别克商务舱舱GL8600宝马宝马550i500别克林别克林荫大道荫大道300客车(金杯、金龙)客车(金杯、金龙)16座座1500提示提示?类:类:?属性:属性:?方法:方法:Vehicle 机动车机动车(父类父类)Car 轿车轿车Bus 客车客车Vehicle-? no(车牌号车牌号)Car-? type(型号型号)Bus-? seatCount(座位数座位数)Vehicle-? calculate(int days) :综合练习综合练习double?为什么使用多态为什么使用多态?问题思考问题思考?宠物饿了,需要主人给宠物喂食宠物饿了,需要主人给宠物喂食不同宠物吃的食物不一样不同宠物吃的食物不一样小猫小猫吃狗粮吃狗粮企鹅企鹅吃鱼吃鱼?不同宠物恢复后体力值不一样不同宠物恢复后体力值不一样小猫小猫健康值增加健康值增加3 3企鹅企鹅健康值增加健康值增加5 为什么使用多态为什么使用多态?分析分析?小猫类小猫类?增加小猫吃食的方法增加小猫吃食的方法?企鹅类企鹅类?增加企鹅吃食的方法增加企鹅吃食的方法?创建主人类创建主人类?编写给小猫喂食的方法编写给小猫喂食的方法?编写给企鹅喂食的方法编写给企鹅喂食的方法示例示例1:未使用多态实现给宠物喂食:未使用多态实现给宠物喂食为什么使用多态为什么使用多态?问题问题?如果再领养如果再领养XXX宠物,就需要给宠物,就需要给XXX喂食,怎么办?喂食,怎么办??添加添加XXX类,继承类,继承Pet类,实现吃食方法类,实现吃食方法?修改修改Master类,添加给类,添加给XXX喂食的方法喂食的方法为什么使用多态为什么使用多态主人类主人类public class Master public void feed( Dog dog ) 测试方法测试方法 Master master = new Master();master.feed(dog);master.feed(penguin);参数都是参数都是Pet类的子类类的子类master.feed(xxx); dog.eat(); public void feed( Penguin pgn ) pgn.eat();public void feed( XXX xxx ) xxx.eat(); 可否使用一个可否使用一个feed(Pet pet)实现对所有宠物的喂食?实现对所有宠物的喂食?频繁修改代码,代码可扩展性、可维护性差,频繁修改代码,代码可扩展性、可维护性差,如何优化?如何优化?使用多态优化设计使用多态优化设计多态的概念多态的概念?生活中的多态生活中的多态?不同类型的打印机打印效果不同不同类型的打印机打印效果不同黑白打印机打印彩色打印机同一种事物,由于条件不同,产生的结果也不同同一种事物,由于条件不同,产生的结果也不同?程序中的多态程序中的多态父类引用,子类对象父类引用,子类对象多态:同一个引用类型,使用不同的实例而执行不同操作多态:同一个引用类型,使用不同的实例而执行不同操作如何实现多态如何实现多态?使用多态实现思路使用多态实现思路?编写父类编写父类编写子类,子类重写父类方法编写子类,子类重写父类方法实现多态的两个要素实现多态的两个要素?运行时,使用父类的类型,子类的对象运行时,使用父类的类型,子类的对象?向上转型向上转型Pet pet = new Dog();自动类型转换自动类型转换?实现多态的两种形式实现多态的两种形式?使用父类作为方法形参实现多态使用父类作为方法形参实现多态?使用父类作为方法返回值实现多态使用父类作为方法返回值实现多态使用多态使用多态?使用多态优化主人给宠物喂食使用多态优化主人给宠物喂食public class Master pet.eat(); 主人类主人类 Pet pet = new Dog();测试方法测试方法public void feed( Pet pet ) Master master = new Master();master.feed( pet );使用父类作为使用父类作为方法形参方法形参 同一种操作方式,同一种操作方式,不同的操作对象不同的操作对象示例示例2:使用多态实现给宠物喂食:使用多态实现给宠物喂食多态练习多态练习1?需求说明需求说明?使用多态实现喂养宠物功能使用多态实现喂养宠物功能增加宠物猫并喂食,其健康值增加增加宠物猫并喂食,其健康值增加4多态练习多态练习2?需求说明需求说明?使用多态实现领养宠物使用多态实现领养宠物?使用父类作为方法返回值使用父类作为方法返回值?实现思路实现思路?在在Master类添加领养方法类添加领养方法getPet(String typeId )创建测试类,根据主人选择宠物类型编号来领养宠物创建测试类,根据主人选择宠物类型编号来领养宠物主人类主人类public class Master public Pet getPet(String typeId ) 使用父类作为使用父类作为返回值类型返回值类型多态的特点多态的特点?Dog d = new Dog();?Pet a = new Dog();?多态的特点多态的特点?对象类型不可变,引用类型可变对象类型不可变,引用类型可变只能调用其引用类型中定义的方法只能调用其引用类型中定义的方法运行时会运行子类覆盖的方法运行时会运行子类覆盖的方法?多态的作用多态的作用?提高代码的通用性提高代码的通用性父类到子类的转换父类到子类的转换?问题问题?实现主人与宠物玩耍功能实现主人与宠物玩耍功能?和小猫玩接飞盘游戏,小猫的健康值减少和小猫玩接飞盘游戏,小猫的健康值减少10,与主人亲密度增加,与主人亲密度增加5?和企鹅玩游泳游戏,企鹅的健康值减少和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加,与主人亲密度增加5?分析分析?给给Dog添加接飞盘方法添加接飞盘方法catchingFlyDisc( )?给给Penguin添加游泳方法添加游泳方法swimming( )给主人添加给主人添加play(Pet pet)方法方法父类到子类的转换父类到子类的转换?代码实现代码实现小猫类小猫类public class Dog extends Pet public void catchingFlyDisc() 企鹅类企鹅类public class Penguin extends Pet public void swimming () 主人类主人类public class Master public void play(Pet pet)pet.catchingFlyDisc(); 测试类测试类Pet pet = new Dog();Master master = new Master();master.pet(pet); 父类到子类的转换父类到子类的转换?父类到子类的转换父类到子类的转换?向下转型(强制类型转换)向下转型(强制类型转换)Pet pet = new Dog( 欧欧欧欧, 雪娜瑞雪娜瑞);Dog dog = (Dog) pet; Penguin png = (Penguin) pet;报错,必须转换为报错,必须转换为父类指向的真实子父类指向的真实子类类型类类型?instanceof运算符运算符?语法语法对象对象 instanceof 类或接口类或接口父类到子类的转换父类到子类的转换?优化主人与宠物玩耍优化主人与宠物玩耍主人类主人类public class Master public void play(Pet pet)if (pet instanceof Dog) /如果传入的是小猫如果传入的是小猫Dog dog = (Dog) pet;dog.catchingFlyDisc();else if (pet instanceof Penguin) /如果传入的是企鹅如果传入的是企鹅Penguin pgn = (Penguin) pet;pgn.swimming();示例示例4:使用多态实现主人与宠物玩耍:使用多态实现主人与宠物玩耍多态练习多态练习3?需求说明需求说明?主人根据宠物编号领养宠物主人根据宠物编号领养宠物主人和小猫玩接飞盘游戏,小猫健康值减少主人和小猫玩接飞盘游戏,小猫健康值减少10,与主人亲密度增,与主人亲密度增加加5主人和企鹅玩游泳游戏,企鹅健康值减少主人和企鹅玩游泳游戏,企鹅健康值减少10,与主人亲密度增加,与主人亲密度增加5?综合练习综合练习1?需求说明需求说明?在前面汽车租赁系统的基础上,实现计算多种车辆总租金的功能在前面汽车租赁系统的基础上,实现计算多种车辆总租金的功能现在有客户租用现在有客户租用?2辆宝马辆宝马?1辆别克商务舱辆别克商务舱?1辆金龙(辆金龙(34)座)座?租租5天共多少租金?天共多少租金??实现思路实现思路?创建车的对象,放在数组中创建车的对象,放在数组中?循环调用循环调用calcRent()方法,计算总租金方法,计算总租金综合练习综合练习2?需求说明需求说明?新购置了卡车,根据吨位,租金每吨每天新购置了卡车,根据吨位,租金每吨每天50对系统进行扩展,计算汽车租赁的总租金对系统进行扩展,计算汽车租赁的总租金?实现思路实现思路?创建卡车类,实现创建卡车类,实现calcRent ()方法方法修改统计租金代码修改统计租金代码多态的作用多态的作用?提高代码的通用性提高代码的通用性Dog d = new Dog();d.sleep();d.eat();Animal a = new Dog();a.sleep();a.eat();总结总结?在本章讨论了在本章讨论了:?封装的概念封装的概念继承的概念及作用继承的概念及作用super关键字关键字抽象类抽象类多态的概念及使用多态的概念及使用强制类型转换强制类型转换
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号