面向对象特性:继承和多态.ppt_第1页
面向对象特性:继承和多态.ppt_第2页
面向对象特性:继承和多态.ppt_第3页
面向对象特性:继承和多态.ppt_第4页
面向对象特性:继承和多态.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

面向对象特性:继承和多态,2,回顾,在Java程序中,代码封装带给我们的好处是什么?举例说明什么是方法重载?Java中的构造方法与实例方法,有什么区别?,3,本章任务,升级HelloWorld,输出Oracle职员的基本信息:使用继承提高代码的复用性使用多态提高代码的可扩展性及可维护性,4,掌握继承掌握super关键字掌握多态,本章目标,5,生活中的继承2-1,生活中,继承的例子随处可见,动物,食草动物,食肉动物,谁是父类?谁是子类?能说出继承的特点吗?,继承需要符合的关系:is-a,父类更通用、子类更具体,6,生活中的继承2-2,子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性,巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?,汽车,请问:出租车包含哪些属性和行为呢?,7,为什么需要继承4-1,开发Oracle职员类,其中职员分为Java职员以及.NET职员,各自的要求如下:Java职员属性:姓名、所属中心方法:编写代码(步骤:启动java开发工具、开始编码)、自我介绍.NET职员属性:姓名、所属中心方法:编写代码(步骤:启动.NET开发工具、开始编码)、自我介绍,8,请问:以下这个解决方案中存在着什么问题?,为什么需要继承4-2,代码存在重复,违背了“writeoncerunanywhere”的原则,9,为什么需要继承4-3,如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?,Java职员是职员吗?.NET职员是职员吗?,publicclassOracleStaffprivateStringname;/职员姓名privateStringschool;/所在中心publicOracleStaff(StringmyName,StringmySchool)name=myName;school=mySchool;publicvoidgiveLesson()System.out.println(“开始编码);publicvoidintroduction()System.out.println(大家好!我是“+school+的+name+。);,现在,所有子类中相同的代码都抽取到父类中了,10,为什么需要继承4-4,publicclassOracleJavaStaff2extendsOracleStaffpublicOracleJavaStaff2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(“启动java开发工具);super.giveLesson();,publicclassOracleDotNetStaff2extendsOracleStaffpublicOracleDotNetStaff2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动.NET开发工具);super.giveLesson();,使用继承,可以有效实现代码复用,子类自动继承父类的属性和方法,子类中不再存在重复代码,11,如何实现继承3-1,在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:,publicclassOracleJavaStaff2extendsOracleStaff/其余代码省略,在父类中只定义一些通用的属性与方法,例如:,publicclassOracleStaffprivateStringname;/职员姓名privateStringschool;/所在中心publicOracleStaff(StringmyName,StringmySchool)/初始化属性值publicvoidgiveLesson()/编码方法的具体实现publicvoidintroduction()/自我介绍方法的具体实现,12,如何实现继承3-2,子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法,publicclassOracleStaffprivateStringname;/职员姓名privateStringschool;/所在中心publicOracleStaff(StringmyName,StringmySchool)/初始化属性值publicvoidgiveLesson()/编码方法的具体实现publicvoidintroduction()/自我介绍方法的具体实现,publicclassOracleJavaStaff2extendsOracleStaffpublicOracleJavaStaff2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(“启动java开发工具);super.giveLesson();,由于giveLesson()方法与父类的实现有所不同,因此重写了该方法,方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型,父类中的属性和方法可以被子类继承,13,publicclassOracleJavaStaff2extendsOracleStaffpublicOracleJavaStaff2(StringmyName,StringmySchool)super(myName,mySchool);,如何实现继承3-3,子类的构造方法中,通过super关键字调用父类的构造方法,方法重写后,通过super关键字调用父类的方法,publicclassOracleJavaStaff2extendsOracleStaffpublicvoidgiveLesson()System.out.println(启动Eclipse);super.giveLesson();,通过调用父类的构造方法,完成对属性值的初始化,14,一切类的“祖先”Object,在Java中,所有的Java类都直接或间接地继承了java.lang.Object类,publicclassMyObject/,publicclassMyObectextendsObject/,在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法,15,小结1,请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。请通过继承实现以上需求,并编写测试类AnimalTest进行测试。,16,继承,继承与构造创建子类的对象会调用子类和父类的构造方法顺序是先调用父类的构造方法,再调用子类的构造方法关于继承Object类是一切类的父类如果一个类如果继承Object可以省略继承的描述一个父类可以有多个子类一个子类只能有一个父类,17,继承与构造,在继承关系中,因创建子类对象而调用子类的构造方法时。会在执行子类构造方法时最先调用并执行其直接父类的构造方法。Object类的构造器总是最先被执行,构造器的执行顺序1-A类构造方法2-B类构造方法3-C类构造方法,18,引用的指向1,内存示意图:,Studentstu=newStudent();,实例,stu,19,引用的指向2,父类类型引用指向子类类型实例:小明在喝水,他喝的真的是“水”么?小明在喝:可乐、矿泉水、绿茶,水,20,为什么需要多态1-1,坐车去世博园,21,为什么需要多态2-1,搭车去世博园,和邻居搭讪上车到目的地道谢下车,22,为什么需要多态2-2,坐火车去世博园,买票检票上车到目的地下车,23,为什么需要多态2-3,坐公交车去世博园,等车排队上车买票到目的地下车,24,为什么需要多态2-4,打出租车去世博园,拦车上车到目的地付车钱下车,25,多态的实现1,publicclassCarpublicvoidgo(),publicclassprivateCarextendsCarpublicvoidgo()System.out.println(和邻居搭讪);System.out.println(上车);System.out.println(到目的地);System.out.println(道谢);System.out.println(下车);,publicclassTrainextendsCarpublicvoidgo()System.out.println(买票);System.out.println(检票);System.out.println(上车);System.out.println(到目的地);System.out.println(下车);,publicclassBusextendsCarpublicvoidgo()System.out.println(等车排队);System.out.println(上车);System.out.println(买票);System.out.println(到目的地);System.out.println(下车);,publicclassTexiextendsCarpublicvoidgo()System.out.println(拦车);System.out.println(上车);System.out.println(到目的地);System.out.println(付车钱);System.out.println(下车);,子类重写父类的方法,26,多态的实现2,如何调用?实现代码,父类类型引用指向子类类型实例,Carcar=newTrain();car.go();,Carcar=newBus();car.go();,Carcar=newPrivateCar();car.go();,Carcar=newTexi();car.go();,和邻居搭讪上车到目的地道谢下车,等车排队上车买票到目的地下车,买票检票上车到目的地下车,拦车上车到目的地付车钱下车,27,为什么需要多态5-1,在Oracle职员类的基础上,开发一个类代表总部,负责对各职员进行评估,评估内容包括:1、职员的自我介绍2、职员的授课,28,为什么需要多态5-2,publicclassHQ1publicvoidjudge(OracleJavaStaff2t)roduction();t.giveLesson();publicvoidjudge(OracleDotNetStaff2t)roduction();t.giveLesson();publicstaticvoidmain(Stringargs)HQ1hq=newHQ1();hq.judge(newOracleJavaStaff2(李明,北京中心“);hq.judge(newOracleDotNetStaff2(张明,天津中心“);,第一种解决方案,大家好!我是北京中心的李明.启动java开发工具开始编码大家好!我是天津中心的张明.启动.Net开发工具开始编码,控制台输出,29,为什么需要多态5-3,现在,升级Oracle职员类,增加一种新类型:OracleDBStaff,该类型的职员专门负责数据库,要求如下:属性:姓名、所属中心方法:编码(启动Oracle,开始编码)同时,总部也负责对这类职员进行评估,30,为什么需要多态5-4,如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立OracleDBStaff类修改总部类,增加方法:judge(OracleDBStafft),每增加一种新的职员类型,都要修改总部类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差,能找到这个解决方案的弊端吗?,31,为什么需要多态5-5,第二种解决方案使用多态,publicclassHQ3publicvoidjudge(OracleStafft)roduction();t.giveLesson();publicstaticvoidmain(Stringargs)HQ3hq=newHQ3();hq.judge(newOracleJavaStaff2(李明,北京中心“);hq.judge(newOracleDotNetStaff2(张明,天津中心);hq.judge(newOracleDBStaff(“李岚,北京中心“);,可以接收子类类型,根据实际创建的对象类型调用相应方法,大家好!我是北京中心的李明.启动java开发工具开始编码大家好!我是天津中心的张明.启动.Net开发工具开始编码大家好!我是北京中心的李岚.启动Oracle开始编码,控制台输出,使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强,32,什么是多态,简单来说,多态是具有表现多种形态的能力的特征同一个实现接口,使用不同的实例而执行不同操作,彩色打印机,打印机,黑白打印机,打印效果:彩色,打印效果:黑白,打印,打印,33,publicclassOracleStaffpublicvoidgiveLesson()System.out.println(“开始编码);,如何实现多态,1、子类重写父类的方法2、编写方法时,使用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法,34,小结2,请编码实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)各种乐器的弹奏(play)方法各不相同。编写一个测试类InstrumentTest,要求:编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。在main方法中进行测试,35,总结2-1,classBasepublicStringname;publicBase()name=Base;publicBase(StringpName)name=pName;publicvoidmethod()System.out.println(name);,classChildextendsBasepublicChild()super(Child1);name=Child2;,给定如下Java代码,编译运行后,输出结果是什么?,publicclassSamplepublicstaticvoidmain(Stringargs)Childc=newChild();c.method();,Child2,控制台输出,1,2,3,36,总结2-2,给定如下Java代码,编译运行后,输出结果是什么?,publicclassOracleStaffpublicvoidgiveLesson()System.out.println(“开始编码);,publicclassOracleDBStaffextendsOracle

温馨提示

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

评论

0/150

提交评论