Java面向对象程序设计与实践应用 课件 第六章 继承与多态-云医院系统的扩展与维护_第1页
Java面向对象程序设计与实践应用 课件 第六章 继承与多态-云医院系统的扩展与维护_第2页
Java面向对象程序设计与实践应用 课件 第六章 继承与多态-云医院系统的扩展与维护_第3页
Java面向对象程序设计与实践应用 课件 第六章 继承与多态-云医院系统的扩展与维护_第4页
Java面向对象程序设计与实践应用 课件 第六章 继承与多态-云医院系统的扩展与维护_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

江苏理工学院第6章继承与多态—云医院系统的扩展与维护时间:主讲人:2025.62025继承机制:构建云医院系统的层级结构多态的应用:云医院中的多元化组合抽象类与接口目录Content010203继承的概念与实现(extends关键字)方法重写(@Override注解)super关键字的使用多态的概念与实现抽象类的定义与使用(abstract关键字)接口的定义与实现(interface关键字)知识要点继承机制:构建云医院系统的层级结构Part.01江苏理工学院继承是子类使用父类部分或全部属性和行为的过程,提高代码复用性。如医院中所有患者共有的属性和行为可定义在父类Patient中。(代码如右侧所示)继承的定义示例代码:publicclassPatient{//基本属性privateStringid;//患者IDprivateStringname;//患者姓名privateintage;//年龄privateStringgender;//性别privateStringroomNumber;//病房号privatebooleanisAdmitted;//是否已入院//构造方法publicPatient(){}publicPatient(Stringid,Stringname,intage,Stringgender,StringroomNumber,booleanisAdmitted){this.id=id;=name;this.age=age;this.gender=gender;this.roomNumber=roomNumber;this.isAdmitted=isAdmitted;}……//这里省略getter和setter方法,读者自行添加即可//覆盖toString方法以便打印患者信息@OverridepublicStringtoString(){return"Patient{"+"id='"+id+'\''+",name='"+name+'\''+",age="+age+",gender='"+gender+'\''+",roomNumber='"+roomNumber+'\''+",isAdmitted="+isAdmitted+'}';} 子类、父类与患者信息在类的声明中,可以通过使用关键字extends来显示地指明其父类。格式为:[修饰符]class子类名extends父类

有时子类为了和父类保持一致或者为了开发方便,就用到了继承机制。由于子类将继承父类的所有字段(包括成员变量和常量)和方法,即父类的所有字段和方法都自动成为子类的字段和方法,因此,子类体内只需写出新增的字段和方法。注意:Java和C++不一样,Java只支持单继承而不支持多继承,即一个类只能有一个基类,一个基类可以派生出多个类。子类对象的创建publicclassCardiacPatientextendsPatient{//心脏病患者特有的属性privateStringheartCondition;//心脏状况描述//构造方法,调用父类的构造方法publicCardiacPatient(Stringid,Stringname,intage,Stringgender,StringroomNumber,booleanisAdmitted,StringheartCondition){super(id,name,age,gender,roomNumber,isAdmitted);//调用父类的构造方法this.heartCondition=heartCondition;}//getter和setter方法publicStringgetHeartCondition(){returnheartCondition;}publicvoidsetHeartCondition(StringheartCondition){this.heartCondition=heartCondition;}//覆盖toString方法,包含心脏病患者的额外信息@OverridepublicStringtoString(){returnsuper.toString()+",heartCondition='"+heartCondition+'\'';}}01示例代码:创建一个CardiacPatient类去继承Patient类子类对象的创建实例代码:实例化一个心脏病患者类的对象并打印他的相关信息publicclassTestCardiacPatient{publicstaticvoidmain(String[]args){//创建一个心脏病患者的实例CardiacPatientpatient=newCardiacPatient("001","张三",60,"男","101",true,"心肌缺血");//打印心脏病患者的信息System.out.println(patient);}}子类对象的创建子类不能直接访问父类私有属性和方法,但子类对象拥有父类所有属性和方法。子类可通过父类提供的方法间接访问私有属性。继承的原则子类构造方法中隐含super(),也可显式调用父类含参构造方法,完成父类属性初始化。用super()调用父类的构造方法继承的实现用super()调用父类的构造方法如果希望在调用Patient类的构造方法时可以直接为属性初始化,那么在Patient类中增添如下构造方法。publicPatient(Stringname,intage){this.setName(name);this.setAge(age);}

同时也为CardiacPatient类增加如下带参构造方法:publicCardiacPatient(Stringname,intage,StringheartCondition){//直接指明调用父类中有两个参数的构造方法super(name,age);this.heartCondition=heartCondition;}那么在TestCardiacPatient类可以对CardiacPatient类实例化:CardiacPatientpatient=newCardiacPatient("张三",60,"心肌缺血");继承的实现成员变量的隐藏子类声明与父类同名成员变量时,会隐藏父类同名变量。子类通过super关键字可访问被隐藏的父类变量。

publicclassDoctor{publicstaticStringposition="医生";publicintage=26;}publicclassPhysicianextendsDoctor{

//隐藏父类的静态成员变量publicStringposition="内科医生";//隐藏父类的实例变量publicintage=48;}publicclassSurgeonextendsDoctor{

publicstaticStringposition="外科医生";publicintage=45;}Part01方法的重写子类可重写父类方法,需满足方法名、参数列表相同,返回类型兼容等条件。重写方法是实现多态的关键。

例如,针对子类CardiacPatient,以不变的权限可以复写父类的toString()方法:@OverridepublicStringtoString(){returnsuper.toString()+"heartCondition='"+heartCondition+'\'';}那么在TestCardiacPatient类可以对CardiacPatient类对象输出信息:CardiacPatientpatient=newCardiacPatient("001","张三",60,"男","101",true,"心肌缺血");System.out.println(patient);这时调用的toString()方法,是子类中的toString()方法,它已经覆盖了父类的同名方法。Part02成员变量的隐藏与方法的重写将子类引用类型转换为父类引用类型,子类对象可视为父类对象,但会失去子类特有属性和方法。上转型对象可操作子类继承或隐藏的成员变量和方法,调用时会执行子类重写后的代码。向上转型的定义转型对象的性质向上转型定义一个父类Staff和它的子类Nurse,子类重写了父类的同名方法,并且具有自己特有的行为。classStaff{publicStringgetName(){return"员工";}publicStringwork(){return"好好工作";}publicvoidintroduce(){System.out.println("我是"+getName()+","+work());}}classNurseextendsStaff{publicStringgetName(){return"护士";}publicStringwork(){return"护理病人";}publicvoidtask(){System.out.println("确保病人尽快康复");}}向上转型测试类:publicclassTestStaff{publicstaticvoidmain(String[]args){Staffstaff=newStaff();roduce();Nursenurse=newNurse();roduce();//调用父类中的方法nurse.task();Staffnurse1=newNurse();//这里的nurse1就是上转型对象roduce();nurse=(Nurse)nurse1;//将上转型对象强制转换为子类对象roduce();nurse.task();//这时nurse对象又具有Nurse所有的属性和行为了}}多态的应用:云医院中的多元化组合Part.02江苏理工学院多态的定义多态指同一个行为具有多个不同表现形式的能力。子类重写父类方法后,通过父类引用调用时,会执行子类重写后的代码。多态的实现条件需具备继承关系、子类重写父类方法、父类引用指向子类对象三个条件。多态的概念多态的实现方式通过父类引用调用子类重写后的方法,实现多态行为。不同子类重写方法后,调用结果不同。多态的应用场景在生物学上,多态表现得尤为显著,如遗传多态性,它是指在一个生物群体中,同一基因座位上存在着两种或多种等位基因,且每一种等位基因在群体中的频率都大于1%的现象。这种多态性在人群中普遍存在,是导致人类表型差异(如肤色、血型、药物代谢能力等)的重要原因。多态的实现classBlood{publicvoidborn(){System.out.println("A型血+B型血可以结合成:AB型血(AB)");}}classChild1extendsBlood{publicvoidborn(){System.out.println("A型血+B型血可以结合成:B型血(BB,BO)");}}classChild2extendsBlood{publicvoidborn(){System.out.println("A型血+B型血可以结合成:A型血(AA,AO)");}}classChild3extendsBlood{publicvoidborn(){System.out.println("A型血+B型血可以结合成:O型血(OO)");}}多态的应用实例代码:用多态来定义遗传多态性。抽象类与接口Part.03江苏理工学院抽象类是不能实例化的类,用于表征问题领域中的抽象概念,可包含抽象方法和具体方法。使用abstract修饰的类为抽象类。格式:abstractclass类名{…}举例:abstractclassDisease{…}abstractclassDevice{…}抽象方法是没有方法体的方法,子类继承抽象类时需实现抽象方法。使用abstract修饰的方法为抽象方法,该方法没有方法体。格式:abstract返回值类型

方法名(参数列表);举例:publicabstractStringgetEtiology();publicabstractvoiddiagnosis(Stringi,Stringj);抽象类用于定义通用行为,子类继承后实现具体行为。如疾病诊断系统中,疾病类可定义为抽象类,具体疾病类继承并实现诊断方法。抽象类的定义抽象方法的定义抽象类的使用抽象类与抽象方法abstractclassDisease{//疾病的通用属性privateStringetiology;//构造方法publicDisease(Stringetiology){this.etiology=etiology;}//症状的抽象表示(这里只是作为演示,通常症状会是一个更复杂的类型)publicabstractvoiddescribeSymptoms();//抽象方法:诊断publicabstractvoiddiagnose();//getter和setterpublicStringgetEtiology(){returnetiology;}publicvoidsetEtiology(Stringetiology){this.etiology=etiology;}//一个通用的方法,如打印疾病名称publicvoidprintDiseaseName(){System.out.println("Disease:"+etiology);}}示例代码抽象类的使用//具体的疾病类:Flu(流感)classFluextendsDisease{//构造方法publicFlu(Stringetiology){super(etiology);}//实现抽象方法:描述症状@OverridepublicvoiddescribeSymptoms(){System.out.println("Symptoms:Fever,cough,bodyaches.");}//实现抽象方法:诊断@Overridepublicvoiddiagnose(){System.out.println("Diagnosis:"+getEtiology()+"isconfirmedbasedonsymptomsandtestresults.");}}测试方法publicclassDiseaseTest{publicstaticvoidmain(String[]args){Diseaseflu=newFlu("InfluenzaA");flu.printDiseaseName();flu.describeSymptoms();flu.diagnose();}}示例代码抽象类的使用运行结果接口是比抽象类更抽象的概念,是方法和常量值的定义集合,只提供形式,无具体实现。01接口的定义修饰符interface

接口名{//声明变量

类型

变量名;……//声明方法

返回值类型

方法名();……}所有定义在接口中的常量都默认为public、static和final。所有定义在接口中的方法都默认为public和abstract,所以不用修饰符限定它们;和类不同的是,一个接口可以继承多个父接口。接口允许类的创建者为一个类建立其形式:有方法名、参数列表和返回类型,但是没有任何方法体。接口也可以包含数据成员。也就是说,接口只提供了形式,而未提供任何具体实现。接口是方法和常量值的定义的集合。接口的定义实现接口的类需实现接口中所有抽象方法,可通过接口实现模拟多继承。02接口的实现class类名implements接口1,接口2{

方法1(){…//方法体

方法1(){…//方法体

}}由关键字implements表示实现的接口,多个接口之间用逗号隔开。多个无关的类可实现同一个接口,一个类可实现多个无关的接口接口的实现实现接口需要注意以下几点。(1)如果实现某接口的类不是abstract类,则在类的定义部分必须实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致。(2)如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法。(3)接口的抽象方法的访问权限修饰符都已指定为public,因此,类在实现方法时,必须显式地使用public。否则,将缩小接口定义方法的访问控制范围。注意事项接口的实现可以把实现某一接口的类创建的对象引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法。实际上,当通过接口变量调用方法时,JVM会根据该变量引用的实际对象类型,动态绑定到对应实现类中重写的方法。接口回调可用于实现多态行为,通过接口变量调用不同实现类的方法。接口回调的定义接口回调的应用接口回调编写测试类:publicclassExample{publicstaticvoidmain(Stringargs[]){Peoplea; //声明接口变量a=newStudent();//实例化,接口变量中存放student对象的引用a.peopleList(); //接口回调a=newTeacher();//实例化,接口变量中存放teacher对象的引用a.peopleList(); //接口回调}}结果:I’mastudent.I’mateacher.示例代码:interf

温馨提示

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

最新文档

评论

0/150

提交评论