第七章继承和多态_第1页
第七章继承和多态_第2页
第七章继承和多态_第3页
第七章继承和多态_第4页
第七章继承和多态_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章继承和多态第一页,共三十四页,编辑于2023年,星期一内容回顾构造方法方法重载封装与访问权限控制第二页,共三十四页,编辑于2023年,星期一本讲内容继承与方法重写多态抽象类与抽象方法instanceof运算符与类型转换第三页,共三十四页,编辑于2023年,星期一本讲目标掌握继承的概念及用法。掌握多态的概念及用法掌握抽象类的使用第四页,共三十四页,编辑于2023年,星期一为什么使用继承?这两个类图有什么问题?-name:String-health:int-love:int-strain:StringDog+print():void+getName():String+getHealth

():int+getLove():int+getStrain:String+Dog()-name:String-health:int-love:int-sex:StringPenguin+print():void+getName():String+getHealth

():int+getLove():int+getSex():String+Penguin()使用继承优化设计将重复代码抽取到父类中第五页,共三十四页,编辑于2023年,星期一继承的好处使用继承优化后:子类与父类是is-a关系

减少代码量方便修改代码第六页,共三十四页,编辑于2023年,星期一如何使用继承使用继承编写父类编写子类,继承父类classPet{

//公共的属性和方法}classDogextendsPet{

//子类特有的属性和方法}classPenguinextendsPet{

}只能继承一个父类继承关键字第七页,共三十四页,编辑于2023年,星期一继承的实现extends关键字用于继承类。声明一个继承父类的类的通常形式如下:

classsubclass-nameextendssuperclass-name{//类体

}

例:classStudentextendsPerson{…}

注:没有extends,默认父类为Object,是最高层类。只能有一个父类,即单继承第八页,共三十四页,编辑于2023年,星期一理解继承子类访问父类成员访问父类属性访问父类方法使用super关键字;super.print();super代表父类对象第九页,共三十四页,编辑于2023年,星期一理解继承子类继承了父类的属性和方法但有些父类成员不能继承:private成员子类与父类不在同包,使用默认访问权限的成员构造方法第十页,共三十四页,编辑于2023年,星期一继承的特点通过继承可以简化类的定义,实现代码的重用Java只支持单继承,不允许多重继承。可以有多层继承;类B继承类A;类C继承类B;子类继承父类的成员变量和成员方法,但不继承父类的构造方法在子类的构造方法中可用super(参数列表)调用父类的构造方法。如果子类的构造方法中没有显式的调用父类构造方法,也没有使用this关键字调用自己的其他构造方法,那么在产生子类实例对象时JVM自动调用父类无参数的构造方法。第十一页,共三十四页,编辑于2023年,星期一何时使用继承何时使用继承?继承与真实世界类似只要说“猫是哺乳动物”,猫的很多属性、行为就不言自明了藏獒是一种狗继承是代码重用的一种方式将子类都有的属性和行为放到父类中符合is-a关系的设计使用继承第十二页,共三十四页,编辑于2023年,星期一小结阅读代码,说出运行结果classCar{privateintsite=4;//座位数Car(){System.out.println("载客量是"+site+"人);}publicvoidsetSite(intsite){this.site=site;}voidprint(){System.out.print("载客量是"+site+"人");}}classBusextendsCar{Bus(intsite){setSite(site);}}publicstaticvoidmain(String[]args){Busbus=newBus(20);bus.print();}载客量是4人载客量是20人第十三页,共三十四页,编辑于2023年,星期一方法重写子类中有和父类相同签名的方法,会如何?子类重写父类方法第十四页,共三十四页,编辑于2023年,星期一方法重写子类可以定义与父类同名的变量,实现对父类变量的隐藏子类可以定义与父类同名的方法,实现对父类方法的覆盖,即方法重写方法重写的条件:必须具有相同的方法名;必须具有相同的参数列表;重写方法的返回值类型必须和被重写方法的返回值类型相同或者是其子类;重写方法的不能缩小被重写方法的访问权限。第十五页,共三十四页,编辑于2023年,星期一方法重写构造方法能被重写吗?如何在子类中调用父类的构造方法?super();super(参数表);可以被默认添加只能是构造方法的第一条语句不能被继承因此不能重写第十六页,共三十四页,编辑于2023年,星期一方法修饰符方法修饰符staticfinalabstract第十七页,共三十四页,编辑于2023年,星期一static修饰符static修饰符修饰的方法叫静态方法目的:使该方法独立于类的实例,使用类去访问,而不是类实例,所以也叫类方法

规则可以调用其他静态方法必须访问静态数据不能使用

super

或this关键字第十八页,共三十四页,编辑于2023年,星期一final修饰符

final不能修改变量子类不能重写方法类不能被继承第十九页,共三十四页,编辑于2023年,星期一Penguin类不希望再被其他类继承?使用final类方法不希望被重写?使用final方法属性值不希望被修改?使用final方法final用法publicfinalclassPenguinextendsPet{//…}最终版的类publicfinalvoidprint(){//…}最终版的方法publicclassPenguin{finalStringhome="南极";//居住地

publicvoidsetHome(Stringname){this.home=home;//错误,home不可以再次赋值

}}最终版的属性值第二十页,共三十四页,编辑于2023年,星期一abstract修饰符由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类抽象方法必须声明在抽象类中抽象方法语法:abstracttypemethod_name(parameter_list);声明抽象类语法:abstractclass{……}使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方法的实现细节抽象方法没有方法体抽象方法必须在子类中被实现,除非子类是抽象类第二十一页,共三十四页,编辑于2023年,星期一

abstract抽象类不能被实例化构造方法

和static

方法不能是抽象的父类的抽象方法往往在子类中实现

abstract修饰符第二十二页,共三十四页,编辑于2023年,星期一小结继承成员变量的隐藏与方法的覆盖的区别为:子类隐藏父类的成员变量只是使之不可见,父类的同名成员变量在子类对象中仍然占有自己独立的内存空间;而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不存在。方法的覆盖与成员变量的隐藏的意义:将父类行为和状态改为自身的行为和状态,对外仍保持统一的接口和名字,不失继承性。第二十三页,共三十四页,编辑于2023年,星期一小结继承猜猜以下程序的运行结果classPerson{ publicPerson(){System.out.println("personconstructor");}}classManextendsPerson{ publicMan(){System.out.println("manconstructor");}}classChineseManextendsMan{ publicChineseMan(){System.out.println("chinesemanconstructor");}}publicclassTest{ publicstaticvoidmain(String[]args){ ChineseMancm=newChineseMan(); }}第二十四页,共三十四页,编辑于2023年,星期一多态宠物生病了,需要主人给宠物看病不同宠物看病过程不一样不同宠物恢复后体力值不一样

打针

吃药

吃药

疗养

狗狗

Q仔

第二十五页,共三十四页,编辑于2023年,星期一编写主人类编写给狗狗看病的方法编写给Q仔看病的方法为什么使用多态publicclassMaster{publicvoidCure(Dogdog){if(dog.getHealth()<50){dog.setHealth(60);System.out.println("打针、吃药");}}publicvoidCure(Penguinpenguin){if(penguin.getHealth()<50)penguin.setHealth(70);System.out.println("吃药、疗养");}}主人类……Mastermaster=newMaster();master.Cure(dog);master.Cure(penguin);……测试方法第二十六页,共三十四页,编辑于2023年,星期一为什么使用多态如果又需要给XXX看病,怎么办?添加XXX类,继承Pet类修改Master类,添加给XXX看病的方法使用多态优化设计频繁修改代码,代码可扩展性、可维护性差第二十七页,共三十四页,编辑于2023年,星期一为什么使用多态使用多态优化后的代码……Petpet=newDog();Mastermaster=newMaster();master.Cure(pet);……测试方法publicclassDogextendsPet{publicvoidtoHospital(){this.setHealth(60);System.out.println("打针、吃药");}}publicclassPenguinextendsPet{publicvoidtoHospital(){

this.setHealth(70);System.out.println("吃药、疗养");}}publicclassMaster{publicvoidCure(Petpet){if(pet.getHealth()<50)pet.toHospital();}}主人类

Dog类

Penguin类1234又要给XXX看病时,只需:1.编写XXX类继承Pet类(旧方案也需要)2.创建XXX类对象(旧方案也需要)3.其他代码不变(不用修改Master类)第二十八页,共三十四页,编辑于2023年,星期一什么是多态生活中的多态你能列举出一个多态的生活示例吗?程序中的多态多态:同一个引用类型,使用不同的实例而执行不同操作父类引用,子类对象

同一种事物,由于条件不同,产生的结果也不同第二十九页,共三十四页,编辑于2023年,星期一实现多态要素实现多态的两个要素:1.方法重写2.使用父类类型第三十页,共三十四页,编辑于2023年,星期一方法重写方法重写的规则在继承关系的子类中重写的方法名、参数、返回值类型必须与父类相同私有方法不能继承因而也无法重写

位置方法名参数表返回值访问修饰符方法重写子类相同相同相同不能比父类更严格方法重载同类相同不同无关无关方法重写方法重载VS第三十一页,共三十四页,编辑于2023年,星期一类型转换子类转换为父类:自动转换假设A类是B类的父类,当我们用子类创建一个对象,而这个对象的引用放到父类的对象中时。Aa;a=newB();或Aa;Bb=newB();a=b;称这个父类对象a是子类对象的上转型对象。例如:“老虎是哺乳动物”,哺乳类是老虎类的父类,但这样说将失掉老虎独有的属性。第三十二页,共三十四页,编辑于2023年,星期一类型转换子类转换为父类细节上转型对象不能操作子类新增的成员变量和方法。上转型对象可以操作子类继承或重写的成员变量和方法如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法。父类转换为子类:强制转换第三十三页,共三十四页,编辑于2023年,星期一instanceof运算符该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false在强制类型转换之前通过instanceof运算符检查对象的真实类型,可以避免类型转换异常,从而提高代码健壮性对象instanceof

类或接口/***测试instanceof运算符的使用。*@author北大青鸟*/publicclassTestPoly2{publicstaticvoidmain(String[]args){Petpet=newPenguin("楠楠","Q妹");//Petpet=newDog("欧欧","雪娜瑞");pet.eat();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论