




已阅读5页,还剩87页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章接口与多态,郑莉,ProgramminginJAVA,.,2,目录,5.1接口5.2塑型5.3多态的概念5.4多态的应用5.5构造方法与多态5.6内部类5.7本章小结,.,3,5.1接口,接口与抽象类一样都是定义多个类的共同属性使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体也可以包含基本数据类型的数据成员,但它们都默认为static和final,.,4,5.1.1接口的作用及语法,接口的作用是面向对象的一个重要机制实现多继承,同时免除C+中的多继承那样的复杂性建立类和类之间的“协议”把类根据其实现的功能来分别代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节实现不同类之间的常量共享,接口,.,5,接口允许我们在看起来不相干的对象之间定义共同行为,5.1.1接口的作用及语法与抽象类的不同,接口,.,6,保险公司的例子具有车辆保险、人员保险、公司保险等多种保险业务,在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable接口在UML图中,实现接口用带有空三角形的虚线表示,5.1.1接口的作用及语法例5_1,接口,.,7,接口的语法声明格式为接口修饰符interface接口名称extends父接口名/方法的原型声明或静态常量接口的数据成员一定要赋初值,且此值将不能再更改,允许省略final关键字接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字,5.1.1接口的作用及语法,接口,.,8,例5.1中的Insurable接口声明如下,可见其中的方法都是抽象方法publicinterfaceInsurablepublicintgetNumber();publicintgetCoverageAmount();publicdoublecalculatePremium();publicDategetExpiryDate();,5.1.1接口的作用及语法例5_1保险接口的声明,接口,.,9,声明一个接口Shape2D,可利用它来实现二维的几何形状类Circle和Rectangle把计算面积的方法声明在接口里pi值是常量,把它声明在接口的数据成员里interfaceShape2D/声明Shape2D接口finaldoublepi=3.14;/数据成员一定要初始化publicabstractdoublearea();/抽象方法在接口的声明中,允许省略一些关键字,也可声明如下interfaceShape2Ddoublepi=3.14;doublearea();,5.1.1接口的作用及语法例5_2,接口,.,10,5.1.2实现接口,接口的实现接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象利用接口设计类的过程,称为接口的实现,使用implements关键字语法如下publicclass类名称implements接口名称/*Bodiesfortheinterfacemethods*/*Owndataandmethods.*/必须实现接口中的所有方法来自接口的方法必须声明成public,接口,.,11,实现接口Insurable,声明汽车类实现例5.1中的Insurable接口,实现接口中的所有抽象方法publicclassCarimplementsInsurablepublicintgetPolicyNumber()/writecodeherepublicdoublecalculatePremium()/writecodeherepublicDategetExpiryDate()/writecodeherepublicintgetCoverageAmount()/writecodeherepublicintgetMileage()/新添加的方法/writecodehere,5.1.2实现接口例5_3,接口,.,12,对象可以被转型为其所属类实现的接口类型getPolicyNumber、calculatePremium是Insurable接口中声明的方法getMileage是Car类新添加的方法,Insurable接口中没有声明此方法Carjetta=newCar();Insurableitem=(Insurable)jetta;/对象转型为接口类型item.getPolicyNumber();item.calculatePremium();item.getMileage();/接口中没有声明此方法,不可以jetta.getMileage();/类中有此方法,可以(Car)item).getMileage();/转型回原类,可调用此方法了,5.1.2实现接口对象转型,接口,.,13,5.1.2实现接口例5_4,classCircleimplementsShape2Ddoubleradius;publicCircle(doubler)radius=r;publicdoublearea()return(pi*radius*radius);,classRectangleimplementsShape2Dintwidth,height;publicRectangle(intw,inth)width=w;height=h;publicdoublearea()return(width*height);,声明Circle与Rectangle两个类实现Shape2D接口,接口,.,14,测试类publicclassInterfaceTesterpublicstaticvoidmain(Stringargs)Rectanglerect=newRectangle(5,6);System.out.println(Areaofrect=+rect.area();Circlecir=newCircle(2.0);System.out.println(Areaofcir=+cir.area();运行结果Areaofrect=30.0Areaofcir=12.56,5.1.2实现接口例5_4运行结果,接口,.,15,声明接口类型的变量,并用它来访问对象publicclassVariableTesterpublicstaticvoidmain(Stringargs)Shape2Dvar1,var2;var1=newRectangle(5,6);System.out.println(Areaofvar1=+var1.area();var2=newCircle(2.0);System.out.println(Areaofvar2=+var2.area();输出结果Areaofvar1=30.0Areaofvar2=12.56,5.1.2实现接口例5_5,接口,.,16,MovableObject接口定义了所有“可移动对象”能做的事情publicinterfaceMovableObjectpublicbooleanstart();publicvoidstop();publicbooleanturn(intdegrees);publicdoublefuelRemaining();publicvoidchangeSpeed(doublekmPerHour);,5.1.2实现接口MovableObject接口,接口,.,17,Plane、Car、Train、Boat分别实现MovableObject接口publicclassPlaneimplementsMovableObjectpublicintseatCapacity;publicCompanyowner;publicDatelastRepairDate;/实现MovalbelObject接口的所有方法publicbooleanstart()/启动飞机,成功则返回truepublicvoidstop()/停止publicbooleanturn(intdegrees)/转向,成功则返回truepublicdoublefuelRemaining()/返回燃料剩余量publicvoidchangeSpeed(doublekmPerHour)/改变速度/plane类自己的方法:publicDategetLastRepairDate()/.publicdoublecalculateWindResistance()/.,5.1.2实现接口MovableObject接口的实现,接口,.,18,为MovableObjects安装遥控器(remotecontrol)publicclassRemoteControlprivateMovableObjectmachine;RemoteControl(MovableObjectm)machine=m;/按下“启动”按钮:publicvoidstart()booleanokay=machine.start();if(!okay)display(NoResponseonstart);/.remotecontrol构造方法的形参类型为MovableObject,它可以是Plane,Car,Train,Boat,等等,5.1.2实现接口RemoteControl类,接口,.,19,5.1.3多重继承,多重继承Java的设计以简单实用为导向,不允许一个类有多个父类但允许一个类可以实现多个接口,通过这种机制可实现多重继承一个类实现多个接口的语法如下类修饰符class类名称implements接口1,接口2,接口,.,20,Car类可以实现接口Insurable,Drivable,SellablepublicclassCarimplementsInsurable,Drivable,Sellable.,5.1.3多重继承Car的例子,接口,.,21,声明Circle类实现接口Shape2D和ColorShape2D具有pi与area()方法,用来计算面积Color则具有setColor方法,可用来赋值颜色通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了多重继承的目的interfaceShape2D/声明Shape2D接口finaldoublepi=3.14;/数据成员一定要初始化publicabstractdoublearea();/抽象方法interfaceColorvoidsetColor(Stringstr);/抽象方法,5.1.3多重继承例5_6,接口,.,22,classCircleimplementsShape2D,Color/实现Circle类doubleradius;Stringcolor;publicCircle(doubler)/构造方法radius=r;publicdoublearea()/定义area()的处理方式return(pi*radius*radius);publicvoidsetColor(Stringstr)/定义setColor()的处理方式color=str;System.out.println(color=+color);,接口,5.1.3多重继承例5_6,.,23,测试类publicclassMultiInterfaceTesterpublicstaticvoidmain(Stringargs)Circlecir;cir=newCircle(2.0);cir.setColor(blue);System.out.println(Area=+cir.area();输出结果color=blueArea=12.56,接口,5.1.3多重继承例5_6运行结果,.,24,5.1.4接口的扩展,接口的扩展接口可通过扩展的技术派生出新的接口原来的接口称为基本接口(baseinterface)或父接口(superinterface)派生出的接口称为派生接口(derivedinterface)或子接口(subinterface)派生接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要实现接口的类也必须实现此接口的父接口接口扩展的语法interface子接口的名称extends父接口的名称1,父接口的名称2,,接口,.,25,Shape是父接口,Shape2D与Shape3D是其子接口。Circle类及Rectangle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D,5.1.4接口的扩展例5_7,接口,.,26,部分代码如下/声明Shape接口interfaceShapedoublepi=3.14;voidsetColor(Stringstr);/声明Shape2D接口扩展了Shape接口interfaceShape2DextendsShapedoublearea();,5.1.4接口的扩展例5_7,接口,.,27,classCircleimplementsShape2Ddoubleradius;Stringcolor;publicCircle(doubler)radius=r;publicdoublearea()return(pi*radius*radius);publicvoidsetColor(Stringstr)color=str;System.out.println(color=+color);publicclassExtendsInterfaceTester/测试类publicstaticvoidmain(Stringargs)Circlecir;cir=newCircle(2.0);cir.setColor(blue);System.out.println(Area=+cir.area();,5.1.4接口的扩展例5_7,接口,.,28,运行结果color=blueArea=12.56说明首先声明了父接口Shape,然后声明其子接口Shape2D之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与area()方法的处理方式最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法,5.1.4接口的扩展例5_7运行结果,接口,.,29,FixedInsurable和DepreciatingInsurable接口都继承了Insurable接口实现它们类也必须实现Insurable接口中的所有方法publicinterfaceDepreciatingInsurableextendsInsurablepublicdoublecomputeFairMarketValue();publicinterfaceFixedInsurableextendsInsurablepublicintgetEvaluationPeriod();,5.1.4接口的扩展Insurable接口的例子,接口,.,30,5.2塑型,塑型(type-casting)又称为类型转换方式隐式(自动)的类型转换显式(强制)的类型转换,.,31,5.2.1塑型的概念,塑型的对象包括基本数据类型将值从一种形式转换成另一种形式引用变量将对象暂时当成更一般的对象来对待,并不改变其类型只能被塑型为任何一个父类类型对象所属的类实现的一个接口被塑型为父类或接口后,再被塑型回其本身所在的类,塑型,.,32,Manager对象可以被塑型为Employee、Person、Object或Insurable,不能被塑型为Customer、Company或Car,5.2.1塑型的概念一个例子,塑型,.,33,基本数据类型相容类型之间存储容量低的自动向存储容量高的类型转换引用变量被塑型成更一般的类Employeeemp;emp=newManager();/将Manager类型的对象直接赋给/Employee类的引用变量,系统会/自动将Manage对象塑型为Employee类被塑型为对象所属类实现的接口类型Carjetta=newCar();Insurableitem=jetta;,5.2.1塑型的概念隐式(自动)的类型转换,塑型,.,34,5.2.1塑型的概念显式(强制)的类型转换,基本数据类型(int)871.34354;/结果为871(char)65;/结果为A(long)453;/结果为453L引用变量:还原为本来的类型Employeeemp;Managerman;emp=newManager();man=(Manager)emp;/将emp强制塑型为本来的类型,塑型,.,35,5.2.2塑型的应用,塑型应用的场合包括赋值转换赋值号右边的表达式类型或对象转换为左边的类型方法调用转换实参的类型转换为形参的类型算数表达式转换算数混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串,塑型,.,36,当一个类对象被塑型为其父类后,它提供的方法会减少当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法将其塑型为本来的类型后,又能接收getSalary()方法了,5.2.2塑型的应用,塑型,.,37,5.2.3方法的查找,如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法?实例方法的查找类方法的查找,塑型,.,38,从对象创建时的类开始,沿类层次向上查找,Managerman=newManager();Employeeemp1=newEmployee();Employeeemp2=(Employee)man;putePay();/调用Employee类中的computePay()方法putePay();/调用Manager类中的computePay()方法putePay();/调用Manager类中的computePay()方法,5.2.3方法的查找实例方法的查找,塑型,.,39,总是在引用变量声明时所属的类中进行查找,Managerman=newManager();Employeeemp1=newEmployee();Employeeemp2=(Employee)man;man.expenseAllowance();/inManageremp1.expenseAllowance();/inEmployeeemp2.expenseAllowance();/inEmployee!,5.2.3方法的查找类方法的查找,塑型,.,40,5.3多态的概念,多态是指不同类型的对象可以响应相同的消息从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的例如所有的Object类的对象都响应toString()方法所有的BankAccount类的对象都响应deposit()方法,.,41,5.3.1多态的目的,多态的目的所有的对象都可被塑型为相同的类型,响应相同的消息使代码变得简单且容易理解使程序具有很好的“扩展性”,多态的概念,.,42,绘图直接的方式希望能够画出任意子类型对象的形状,可以在Shape类中声明几个绘图方法,对不同的实际对象,采用不同的画法if(aShapeinstanceofCircle)aShape.drawCircle();if(aShapeinstanceofTriangle)aShape.drawTriangle();if(aShapeinstanceofRectangle)aShape.drawRectangle();,5.3.1多态的目的一个例子,多态的概念,.,43,绘图更好的方式在每个子类中都声明同名的draw()方法以后绘图可如下进行Shapes=newCircle();s.draw();Circle属于Shape的一种,系统会执行自动塑型当调用方法draw时,实际调用的是Circle.draw()在程序运行时才进行绑定,接下来介绍绑定的概念,5.3.1多态的目的一个例子,多态的概念,.,44,5.3.2绑定的概念,绑定指将一个方法调用同一个方法主体连接到一起根据绑定时期的不同,可分为早期绑定程序运行之前执行绑定晚期绑定也叫作“动态绑定”或“运行期绑定基于对象的类别,在程序运行时执行绑定,多态的概念,.,45,仍以绘图为例,所有类都放在binding包中基类Shape建立了一个通用接口classShapevoiddraw()voiderase()派生类覆盖了draw方法,为每种特殊的几何形状都提供独一无二的行为classCircl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卫生噪音面试题及答案
- 家电公司库存处理管理细则
- 采制样考试题及答案
- vda考试题及答案
- 放射防护考试题及答案
- 造林绿化工技师的考试试题及答案
- 三亚雇员考试试题及答案
- 职教教研工作总结
- 家电公司合同印章管理细则
- 家电公司应急演练管理规定
- 2024新版药品管理法培训课件
- 护士健康宣教指导手册系列老年病房
- 贵州省遵义市红花岗区2024届小升初模拟数学测试卷含解析
- 中建三局三公司安装分公司劳务企业定额
- 狼疮肾炎的营养支持策略
- 初中数学“综合与实践”如何开展项目式学习义务教育课程方案和课程标准国家级示范培训课件
- 2024年广东梅州市梅江区总工会社会化工会工作者招聘笔试冲刺题(带答案解析)
- 一二手联动培训课件
- 创业中的团队管理与组建
- 六角亭承包合同书
- 骨科膝骨关节炎一病一品优质护理汇报课件
评论
0/150
提交评论