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

付费下载

下载本文档

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

文档简介

昨日总结作业评讲上课啦第8天

继承和多态菜单北京传智播客教育继承super关键字方法重写final关键字多态其他扩充内容生活中的继承生活中,继承的例子随处可见动物食草动物食肉动物为什么使用继承1这两个类有什么问题?-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()使用继承优化设计将重复代码抽取到另一个类中:父类为什么使用继承2使用继承优化后:子类与父类是is-a关系减少代码量方便修改代码如何使用继承编写父类编写子类,继承父类classPet{

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

//子类独有的属性和方法}classCatextendsPet{

}只能继承一个父类继承关键字理解继承Java中的子类究竟可以从父类中继承哪些“财产”呢?子类可以继承父类中使用public和protected修饰的属性和方法,不论子类和父类是否在同一包中。子类可以继承父类中使用默认修饰符修饰的属性和方法,但子类和父类必须在同一个包中。子类无法继承父类中使用private修饰的属性和方法。但可以通过继承它的getter/setter方法访问到私有属性。官方文档原文如下: Asubclassdoesnotinherittheprivatemembersofitsparentclass.However,ifthesuperclasshaspublicorprotectedmethodsforaccessingitsprivatefields,thesecanalsobeusedbythesubclass.子类无法继承父类的构造方法。演示示例创建子类对象时的内存模型Dogs=newDog();Petp=newDog();栈堆Dogs独有属性supernewDog();父类空间父类私有属性Object.classPet.classDog.class方法区this继承中的方法对于方法而言:要么子类直接继承父类方法,原样使用;要么子类重写父类同名方法。方法重写的规则:子类的方法必须和父类中被重写的方法的名称相同。子类的方法必须和父类中被重写的方法的参数相同,包括参数的个数、数据类型以及顺序。子类方法的返回类型必须和父类中被重写的方法的返回类型相同或是其子类。子类方法的访问修饰符权限不能小于父类中被重写的方法的访问修饰符权限。方法重写编码演示小结没有继承就没有方法重写?没有继承就没有方法重载?super关键字在子类中可以通过super关键字访问父类非私有成员访问父类构造方法访问父类非私有属性访问父类非私有方法使用super关键字;super.print();演示示例:super用法super代表当前子类对象里的父类内存空间super();

super(参数表);只能是构造方法的第一条语句被默认添加继承中的构造方法执行顺序父类属性子类属性父类构造方法子类构造方法

一切类的“祖先”——Object在Java中,所有的Java类都直接或间接地继承了java.lang.Object类publicclassMyObject{//…}publicclassMyObectextendsObject{

//…}我们自定义的类会自动继承Objectsuper和this的区别小结如果子类继承了父类,父类中定义了有参的构造方法,但是没有无参的构造方法,创建子类对象时会怎么样?super();和this();可以同时出现在子类构造方法中吗?

继承中的代码块(了解即可)父类静态代码块子类静态代码块父类构造代码块父类构造方法子类构造代码块子类构造方法演示示例综合案例某汽车租赁公司出租多种车辆,如下:请计算并输出客户要租的车的基本信息和租赁总价汽车品牌宝马宇通座位7座32座日租费5001000Dog类不希望再被其他类继承?使用final类方法不希望被重写?使用final方法属性值不希望被修改?使用final属性final关键字publicfinalclassDogextendsPet{//…}最终版的类publicfinalvoidprint(){//…}最终版的方法publicclassPenguin{finalStringHOME="南极";//居住地

publicvoidsetHome(Stringhome){this.HOME=home;//错误,home不可以再次赋值}}最终版的属性值为什么使用多态1编写医生类编写给狗狗看病的方法编写给Q仔看病的方法编写测试方法调用医生类给狗狗看病的方法调用医生类给Q仔看病的方法publicclassDoctor{publicvoidCure(Dogdog){if(dog.getHealth()<50){dog.setHealth(60);System.out.println("打针、吃药");}}publicvoidCure(Penguinpenguin){if(penguin.getHealth()<50)penguin.setHealth(70);System.out.println("吃药、疗养");}}……Doctordr=newDoctor();dr.Cure(dog);dr.Cure(penguin);……为什么使用多态2如果又需要给猫...给猪...给鸡看病,怎么办?添加Cat类,继承Pet类修改Doctor类,添加给Cat看病的方法使用多态优化设计频繁修改代码,代码可扩展性、可维护性差什么是多态生活中的多态你能列举出一个多态的生活示例吗?(H2O、水、冰、气)程序中的多态父类引用子类对象

同一种事物,由于条件不同,产生的结果也不同父类对象名=

new子类();Petp1=newCat();Petp2=newDog();p1.eat();p2.eat();多态:同一个引用类型(父类),使用不同的实例对象(子类),从而执行不同的操作(方法重写)如何实现多态1用多态实现人使用打印机(要具备良好的可扩展性)分为黑白打印机和彩色打印机不同类型的打印机打印效果不同黑白打印机彩色打印机打印将来?如何实现多态2实现多态的三个步骤:1.实现继承(is-a)2.子类重写父类方法3.使用父类类型引用所有子类对象现场编码实现打印机向上向下转型Petp=newDog();//向上转型,符合继承中的is-a关系p.eat();缺点:不能调用子类独有的成员,因为在“执行”(而非编译期间)前无法判断父类所引用对象的实际类型Petp=newDog();Dogd=(Dog)p;//向下转型,必须强转,因为不符合继承中的is-a关系,但可以调用子类独有的方法Petp=newPet();Dogd=(Dog)p;//可以吗?多态的细节成员变量(非私有):编译时:看的是引用类型变量所属的类中是否有所调用的变量运行时:也是看引用类型变量所属的类中是否有所调用的变量成员变量无论编译还是运行都看引用类型变量所属的类简单记:成员变量在编译和运行时都看等号左边成员方法(非私有):编译时:要查看引用变量所属的类中是否有所调用的成员(不能是独有的方法)。在运行时:要查看对象所属的类中是否有所调用的成员。如果父子出现同名的方法,会运行子类中的方法,因为方法有覆盖的特性编译看左边运行看右边编码演示(同名属性)栈堆Pets独有属性supernewDog();父类空间Object.classPet.classDog.class方法区编码演示小结使用多态实现计算汽车租赁价总结继承的好处?多态的好处?没有继承就没有方法重写?没有继承就没有多态?提高代码重用,优化程序设计提高可扩展性和可维护性练习题下列()可以加入到Sample类中,并且能够编译正确。publicclassSample{ publicintgetSomething(intd) {returnd; }}privateintgetSomething(inti,Strings){}publicvoidgetSomething(inti){}privateintgetSomething(inti,Strings){return20;}publicdoublegetSomething(){return10.0;}练习题下面的类中共有()个构造方法。publicclassSample{ privateintx; privateSample(){x=1; } publicvoidSample(doublef){this.x=(int)f; } publicSample(Strings){}} 4 3 2 1练习题给定如下Java代码,下列()选项可以正确加入到Sub类中。 publicclassSuper{ publicfloatgetNum(){ return5.Of; } } publicclassSubextendsSuper{ }publicfloatgetNum(){return4.0f;}publicvoidgetNum(){}publicgetNum(doubled){}(没有返回值类型,考虑构造方法,但是又与子类不同,不是构造方法,却没有返回值类型.)publicdoublegetNum(floatd){return4.0d;}练习题请指出下面代码中存在()处错误,并说明错误原因。publicclassSample{ publicvoidamethod(inti,Strings){} publicvoidamethod(Strings,inti){} publicintamethod(Strings1,Strings2){} privatevoidamethod(inti,Strings){} publicvoidAmethod(inti,Strings){} privatevoidamethod(inti);} 4 3 2 1练习题用

温馨提示

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

最新文档

评论

0/150

提交评论