Java程序设计教程(第三版)课件 项目五 类的继承与多态(2.0)_第1页
Java程序设计教程(第三版)课件 项目五 类的继承与多态(2.0)_第2页
Java程序设计教程(第三版)课件 项目五 类的继承与多态(2.0)_第3页
Java程序设计教程(第三版)课件 项目五 类的继承与多态(2.0)_第4页
Java程序设计教程(第三版)课件 项目五 类的继承与多态(2.0)_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

项目五类的继承与多态

相关词汇:extends:继承2.baseclass:基类derivedclass

:派生类4.polymorphism:多态override:重写、覆写6.overload:重载7.upcasting:向上转型8.downcasting:向下转型复习:1、封装的两层含义:第一层是将类的属性和行为封装在一个类中,对类外而言,无需了解类内部的实现细节。第二层含义是将类的属性的访问权限用关键字private去修饰。用private修饰的属性只能在本类中访问,类以外是无法直接访问的,但可以通过类的公有方法去访问。2.封装的目的封装的目的就是保护内容,保证某些属性或方法不被外部看见。3.封装的实现使用私有访问权限:private。

private修饰符定义的成员变量或成员方法,只能在声明它们的类中访问,不能在其他类中访问。【项目描述】类的封装、继承与多态是面向对象的三大特征。类的封装我们前面已经介绍了,本项目是通过Person类及其子类的创建,介绍了类的继承及多态的使用。

【任务分解】

本项目可分解为以下四个任务:1.类的继承。2.进一步学习继承。3.类的多态。4.进一步学习多态。任务一类的继承

【任务描述】

任务5-1:定义一个父类Person,包含的属性有“id和“姓名”。有说话方法,用于输出id和姓名信息;定义Person类的两个子类Teacher类和Student类,在两个子类中有一个introduction方法,介绍自己是教师还是学生,并输出自己的id和姓名。跳至解题思路【必备知识】1.继承的概念

继承是指由现成的类产生新的类。被继承的现成类称为父类或超类,新产生的类称为子类或派生类。通过继承机制,子类继承了父类的成员属性和成员方法,并且可以定义自己新的成员属性和方法,也可以对父类的成员变量或方法进行修改,使类的功能得以扩充。

2.继承的作用

什么时候需要使用继承呢?当两个类拥有相同的方法或属性,即两个类存在重复代码,此时代码设计要遵循“一次编写,仅编写一次”的原则。使用继承可以解决代码重复的问题。示例1:创建一个Teacher类,具有id、姓名属性。具有说话方法;创建一个Student类,具有id、姓名属性。具有说话方法。classTeacher{ privateStringid;//声明id属性 privateStringname;//声明姓名属性publicTeacher(Stringid,Stringname){//构造方法,对各属性赋初值this.id=id; =name; }

publicvoidsay(){//定义say()方法,输出信息

System.out.println("大家好!我是一名教师。"); System.out.println("Id:"+id+",姓名:"+name); }}

classStudent{ privateStringid;//声明id属性 privateStringname;//声明姓名属性 /**构造方法,对各属性赋初值*/publicStudent(Stringid,Stringname){this.id=id; =name; }

publicvoidsay(){//定义say()方法,输出信息System.out.println("大家好!我是一名学生。");System.out.println("Id:"+id+",姓名:"+name); }}3.继承的实现在Java中类的继承格式以下:[格式5-1类的继承格式]class父类{…}//定义父类class子类extends父类{…}//用extends关键字实现类的继承示例2:创建一个Person类,具有id、姓名属性,具有说话方法。分别创建继承于Person类的子类Teacher类和Student类,在两个子类中什么代码也不写,观察代码运行结果。下面,对示例1进行整改,即为Teacher类和Student类抽象出一个父类Person,在Person类中实现Teacher类和Student类的共同属性和方法。Teacher类和Student类在继承Person类的基础上,增加自己的属性和方法,完成类的设计。packagecom;classPerson{ privateStringid;//声明id属性 privateStringname;//声明姓名属性

publicStringgetId(){ returnid; } publicvoidsetId(Stringid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; }

publicvoidsay(){//定义say()方法,输出信息 System.out.println("Id:"+id+",姓名:"+name); }}classTeacherextendsPerson{//Teacher类继承Person类

}

classStudentextendsPerson{

}

publicclassExample5_2{ publicstaticvoidmain(Stringargs[]){ Teacherteacher=newTeacher(); teacher.setId("116"); teacher.setName("林小蕾"); teacher.say(); Studentstu=newStudent(); stu.setId("301"); stu.setName("张俊"); stu.say(); }}示例3:创建一个Person类,具有id、姓名属性,具有说话方法。分别创建继承于Person类的子类Teacher类和Student类,在子类中分别定义一个自我介绍的方法,方法输出自己的身份和基本信息。classPerson{ privateStringid;//声明id属性 privateStringname;//声明姓名属性 publicPerson(Stringid,Stringname){//构造方法,对各属性赋初值 this.id=id; =name; } publicvoidsay(){//定义say()方法,输出信息 System.out.println("Id:"+id+",姓名:"+name); }}classTeacherextendsPerson{//Teacher类继承Person类publicTeacher(Stringid,Stringname){ super(id,name);//调用父类的构造方法 } publicvoidintroduction(){ System.out.println("大家好!我是一名教师。"); super.say();//调用父类的say方法,输出基本信息 }}classStudentextendsPerson{ publicStudent(Stringid,Stringname){ super(id,name);//调用父类的构造方法 }

publicvoidintroduction(){ System.out.println("大家好!我是一名学生。"); super.say();//调用父类的say方法,输出基本信息 }}【解题思路】

任务5-1:1.定义一个父类Person类,定义id和姓名属性,定义带参构造方法以及说话的方法。说话方法用于输出两个子类共同的属性。2.分别定义两个子类Teacher类和Student类,添加带参构造方法。在子类的方法体中调用父类的方法。若要调用父类的构造方法,可在子类的构造方法中使用super(参数列表)调用父类的构造方法。3.声明一个测试类,利用带参构造方法分别实例化一个Teacher类和Student类对象。分别调用父类的方法,输出对象的信息。重温任务描述示例分析:本示例先定义一个父类Person,在Person类中定义了“id”和“name”属性,还定义了一个带参构造方法Person(Stringid,Stringname),其作用是为属性赋初值,另外还定义了一个say()方法,用于输出“id”和“name”信息。接着,定义了继承于Person类的两个子类——Teacher类和Student类。子类自动继承父类Person的属性和方法(不继承父类的构造方法)。在子类中定义introduction()方法,此方法有两条语句,第一条语句是介绍自己的特性,第二条语句是通过调用了父类的say()方法输出共性的东西。从本示例可知,子类继承父类,可以扩展已有类的功能。【任务透析】packagecom;classPerson{ privateStringid;//声明id属性 privateStringname;//声明姓名属性 publicPerson(Stringid,Stringname){//构造方法,对各属性赋初值 this.id=id; =name; }

publicvoidsay(){//定义say()方法,输出信息 System.out.println("Id:"+id+",姓名:"+name); }}

classTeacherextendsPerson{//Teacher类继承Person类 publicTeacher(Stringid,Stringname){ super(id,name);//调用父类的构造方法 }· publicvoidintroduction(){ System.out.println("大家好!我是一名教师。"); super.say();//调用父类的say方法 }}classStudentextendsPerson{ publicStudent(Stringid,Stringname){ super(id,name);//调用父类的构造方法 }

publicvoidintroduction(){ System.out.println("大家好!我是一名学生。"); super.say();//调用父类的say方法 }}

publicclassExtDemo5_1Test{ publicstaticvoidmain(Stringargs[]){ Teacherteacher=newTeacher("116","林小蕾"); Studentstu=newStudent("301","张俊"); roduction(); roduction(); }}【课堂提问】☆.什么时候需要使用继承?☆.如何实现继承?☆.this和super关键字的作用是什么?

【现场演练】模仿任务5-1:设计一个类Book,有属性bookName,bookPrice,author(作者),number(订购数目),有方法getBookInfo(),获取书的各种信息。写类XiaoShuo(小说)继承Book,有属性renWu(人物),有方法getBookKind()方法,在该方法中打印出所属类别,并调用父类的getBookInfo()方法用于输出小说的各种信息。写类JiaoCai(教材)继承Book,有属性keMu(科目),有方法getBookKind()方法,在该方法中打印出所属类别,并调用父类的getBookInfo()方法用于输出教材的各种信息。【知识链接】this关键字的作用1.使用this引用当前对象的成员属性。this.成员属性2.强调是本类的成员方法。this.成员方法名(参数表)3.this关键字强调是当前对象。

super关键字的作用1.在子类中通过super访问父类成员属性。super.成员变量名2.调用父类成员方法super.成员方法名(参数表)3.利用super(),调用父类中的构造方法。super(参数表)

☆Object类在Java中,定义有一种特殊的类Object,其他所有的类都是Object的子类。也就是说,Object是所有对象引用继承层次结构的根。☆Java只支持单继承Java只支持单继承,不能使用多重继承,即一个类只能继承另一个类,不充许一个类同时继承两个或以上的类。但是,Java充许多层继承,即一个类可以继承某一个类的子类。如:classX{}classY{}classZextendsX,Y{}以上代码是错误的,即Z类不能同时继承于X和Y类。正确的代码如下所示:classX{}classYextendsX{}classZextendsY{}即Y继承X,Z继承Y。任务二

进一步学习继承

【任务描述】

任务5-2:为子类Teacher添加一个无参构造方法,并在父类Person中也添加一个无参的构造方法。在各自的构造方法中输出一句提示,观察父类和子类构造方法的调用关系及顺序。并为父类Person的每一个属性添加一个setter()和getter()方法,调用setter()和getter()方法为子类的实例对象赋值。跳至解题思路【必备知识】1.子类实例化过程

子类对象在实例化时是先调用父类中的构造方法,然后再调用子类自己的构造方法。

2.使用setter和getter方法访问父类的私有属性

当父类中的成员属性是用关键字private修饰时,其子类是不能直接访问这些属性的。在任务一中,我们是通过调用父类的带参构造方法来给这些属性赋值班的。除了可使用带参的构造方法给属性设置初值外,子类的实例对象还可以通过setter()和getter()方法来访问父类中的私有属性。示例4:为子类Teacher添加一个无参构造方法,并在父类Person中也添加一个无参的构造方法。在各自的构造方法中输出一句提示,观察父类和子类构造方法的调用关系及顺序。classPerson{//定义一个父类Person privateStringid;//声明id属性 privateStringname;//声明姓名属性

publicPerson(){ super();//此处的super指的是所有类的父类,最顶层的Object System.out.println("你好,我是父类Teacher的无参构造方法!!!!"); }}classTeacherextendsPerson{//定义一个子类Teacher,继承于类Person publicTeacher(){ super();//此处super关键字的作用是调用父类Person的无参构造方法 System.out.println("你好,我是子类Teacher的无参构造方法!"); }}publicclassExample5_4{ publicstaticvoidmain(String[]args){ Teachert=newTeacher(); }}从本例运行结果可知,虽然实例化的是子类对象,但事实上,在实例化子类对象时是先调用父类中的构造方法的,然后再调用子类自己的构造方法。【解题思路】

任务5-2:1.在子类Teacher中添加一个无参构造方法,并在该构造方法中输出一句提示“你好,我是子类Teacher的无参构造方法”。2.在父类Person中添加一个无参构造方法,并在该构造方法中输出一句提示“你好,我是父类Person的无参构造方法”。3.在父类Person中为属性id和name添加一对setter()和getter()方法。4.声明一个测试类,利用无参构造方法实例化一个Teacher子类对象,调用父类的setter()和getter()方法。观察程序输出结果。重温任务描述【任务透析】packagecn;classPerson{//定义一个父类Person privateStringid;//声明id属性 privateStringname;//声明姓名属性 publicStringgetId(){ returnid; } publicvoidsetId(Stringid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } publicPerson(){ super();//此处的super指的是所有类的父类,最顶层的Object System.out.println("你好,我是父类Teacher的无参构造方法!!!!"); }}classTeacherextendsPerson{//定义一个子类Teacher,继承于类Person

publicTeacher(){ super(); System.out.println("你好,我是子类Teacher的无参构造方法!"); }}

publicclassExtDemo5_2Test{ publicstaticvoidmain(String[]args){ Teachert=newTeacher(); t.setId("2011007"); t.setName("何小倩"); System.out.println("我的Id是:"+t.getId()+"我的名字是:"+t.getName()); }}【课堂提问】☆.什么时候需要使用继承?☆.如何实现继承?☆.this和super关键字的作用是什么?

【现场演练】模仿任务5-2:在父类Book中添加一个无参的构造方法,为子类类XiaoShuo(小说)添加一个无参构造方法,并在各自的构造方法中输出一句提示,观察父类和子类构造方法的调用关系及顺序。并为父类Book的每一个属性添加一个setter()和getter()方法,调用setter()和getter()方法为子类的实例对象赋值。任务三

类的多态

【任务描述】

任务5-3:在任务5-2的基础上,在父类Person中添加一个run()方法,在子类Teacher中定义和父类相同名字的run()方法。在测试类中,分别生成子类Teacher和父类Person的实例对象,并利用各自的实例对象去调用同名方法run(),观察运行结果。跳至解题思路【必备知识】1.多态的概念多态性是面向对象程序设计的重要特征之一。多态性是指同一个方法名可以有不同的实现体,即不同的方法体。在Java语言中通过以下两种方式来实现多态性:(1)方法重写(也称覆写或覆盖)。(2)方法重载。

2.多态的作用多态是为了实现接口重用,使用对象多态性,以提高代码的可维护性和可扩展性。3.多态的实现(1)方法重写1)重写是发生在继承关系的两个类中,当一个类继承了另一个类,就可以在子类中定义一个与父类中的方法同名的方法,子类中的这个方法就是对父类同名方法的重写,用以实现父类方法所不能实现的功能。

2)重写是子类中的方法对父类中已有的方法进行重新定义。3)子类中重写的方法与父类的方法在返回类型、方法名、参数列表上必须完全相同。而且在子类中覆写的方法权限必须大于(或等于)父类中方法的访问权限。Java中有4种访问控制权限:public>protected>default(缺省:什么关键字都不加)>private4)当以子类的对象调用与父类同名的方法时,会直接找到子类的方法,而不是父类的同名方法,当发现子类中不存在这个方法时,才会调用父类中的同名方法。(2)方法重载

方法重载是发生在同一个类中,即在同一个类中存在几个同名方法,方法参数类型或个数有所区别。如果参数类型和个数完全一样,只是方法返回类型不同,不属于重载。【解题思路】

任务5-3:1.在父类Person中添加一个run(),在该方法中输出一句提示“我是父类Person的run()方法!”。2.在子类Teacher中定义一个和父类的方法run(),在该方法中输出一句提示“我是子类Teacher的run()方法!”。3.声明一个测试类,分别生成子类Teacher和父类Person的实例对象,并利用各自的实例对象去调用同名方法run(),观察程序输出结果。重温任务描述【任务透析】packagett;classPerson{//定义一个父类Person privateStringid;//声明id属性 privateStringname;//声明姓名属性

publicPerson(Stringid,Stringname){ super(); this.id=id; =name; }

publicvoidsay(){ System.out.println("我是父类Person的say()方法,我的Id是:"+id+",我的名字叫:"+name); }

publicvoidrun(){ System.out.println("我是父类Person的run()方法!"); }}classTeacherextendsPerson{//定义一个子类Teacher,继承于类Person publicTeacher(Stringid,Stringname){ super(id,name); }

publicvoidrun(){ System.out.println("我是子类Teacher的run()方法!\n"); }}

publicclassExtDemo5_3Test{ publicstaticvoidmain(String[]args){ Teachert=newTeacher("2014013","文静"); t.say();//在父类中定义了say()方法,子类中没有定义该方法,则子类对象会调//用父类的该方法。 t.run();//在子类中重写了父类的同名方法,那么子类对象调用的是自己的方法。 Personp=newPerson("2002135","雷蕾"); p.run();}}【课堂提问】☆.如何实现多态?☆.方法重载和方法重写的主要区别是什么?

【现场演练】模仿任务5-3:设计一个类Book,有属性bookName,bookPrice,author(作者),number(订购数目),有方法getBookInof(),获取书的各种信息。写类XiaoShuo(小说)继承Book,有属性renWu(人物)。重写父类方法getBookInfo(),用来打印出小说的各种信息。写类JiaoCai(教材)继承Book,有属性keMu(科目),重写抽象方法getBookInfo(),用来打印出教材的各种信息。【知识链接】☆final关键字的作用1.final关键字修饰的类是不同被继承的。2.final关键字修饰的方法是不能被重写的。3.final关键字修饰的量是常量。任务四

进一步学习多态

【任务描述】任务5-4:在任务5-1教师类和学生类的的基础上,开发一个学校人员身份确认类,对各成员的自我介绍内容进行确认。同时,增加一个行政人员类型,该类型人员同样是有一个自我介绍的方法,介绍自己是行政人员,并输出自身的id和姓名信息。跳至解题思路【必备知识】在讲述新的知识点之前,我们先来看两个示例。示例5:

在示例3基础上,添加一个学校人员身份确认类,分别对教师和学生的自我介绍内容进行确认。示例3回顾:创建一个Person类,具有id、姓名属性,具有说话方法。分别创建继承于Person类的子类Teacher类和Student类,在子类中分别定义一个自我介绍的方法,方法输出自己的身份和基本信息。packagecom;classIdentityConfirm{ publicvoidconfirm(Teachert){//对教师身份进行确认 roduction(); }

publicvoidconfirm(Students){//对学生身份进行确认 roduction(); }}

publicclassExample5_5{ publicstaticvoidmain(Stringargs[]){ Teacherteacher=newTeacher("116","林小蕾"); Studentstu=newStudent("301","张俊"); roduction(); roduction(); }}示例分析:本示例中增加了一个身份确认类IdentityConfirm,在该类中有两个重载的方法confirm,其作用是通过调用教师和学生各自的自我介绍内容对其身份进行确认,因此两个confirm方法的形式参数类型分别是Teacher类和Student类,分别用于接收Teacher类和Student类的实例对象。示例6:在示例5的基础上,再增加一种行政人员类型,此类型包含的属性有id和姓名,包含的一个自我介绍方法。packagecom;classAdministrationStaffextendsPerson{//定义Person类的子类AdministrationStaff

publicAdministrationStaff(Stringid,Stringname){ super(id,name);//调用父类的构造方法 }

publicvoidintroduction(){//重写父类的introduction()方法 System.out.println("大家好!我是一名行政人员。"); super.say(); }}classIdentityConfirm{ publicvoidconfirm(Teachert){//对教师身份进行确认 roduction(); }

publicvoidconfirm(Students){//对学生身份进行确认 roduction(); }

publicvoidconfirm(AdministrationStaffa){//对行政人员身份进行确认 roduction(); }}

publicclassExample5_6{ publicstaticvoidmain(Stringargs[]){ Teacherteacher=newTeacher("116","林小蕾"); Studentstu=newStudent("301","张俊"); roduction(); roduction(); AdministrationStaffad=newAdministrationStaff("352","刘美美"); roduction(); }}示例分析:由于本示例增加了一个行政人员类型,所以在IdentityConfirm身份确认类中得增加一个confirm(AdministrationStaffa)方法,如果要继续增加新的人员类型,那么还得继承修改IdentityConfirm类,这种需要不断修改代码来满足需求的方式,说明代码的可维护性和可扩展性极其不好。这时,我们可使用对象的多态性,以提高代码的可维护性和可扩展性。【必备知识】1.Java多态存在的三个必要条件(1)需要有继承关系的存在(2)需要有方法的重写(3)需要有父类的引用指向子类对象

2.对象多态的两种类型多态性是面向对象程序设计的重要特征之一。多态性是指同一个方法名可以有不同的实现体,即不同的方法体。

3.对象转型格式多态是为了实现接口重用,使用对象多态性,以提高代码的可维护性和可扩展性。【解题思路】任务5-4:1.在子类Teacher类、Student类和AdministrationStaff类中重写父类Person的say()方法,具有不同的方法体。2.定义一个身份确认类IdentityConfirm,在该类添加一个对说话内容进行确认的confirm方法,形参类型是父类Person类型,方法体对say方法进行调用。此时,所有的子类类型都可以作为参数传入。这样,就不必像示例5那样需要为每一个子类类型编写单独的confirm方法。3.在主方法中,调用IdentityConfirm类的confirm方法时,可传入不同的子类对象,Java虚拟机会根据不同的对象去调用不同的say()方法。重温任务描述【任务透析】classPerson{

温馨提示

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

评论

0/150

提交评论