《java语言程序设计》第5章.ppt
《《java语言程序设计》第5章.ppt》由会员分享,可在线阅读,更多相关《《java语言程序设计》第5章.ppt(57页珍藏版)》请在装配图网上搜索。
第5章接口与多态,,ProgramminginJAVA,2,目录,5.1接口5.2塑型5.3多态的概念5.4多态的应用5.5构造方法与多态5.6内部类5.7本章小结,3,5.1接口,接口与抽象类一样定义多个类的共同属性与方法.接口中的方法都是抽象方法,仅给出方法的声明,不给出具体实现。具体实现由其实现类(对于抽象类来说是子类)来完成。接口中的属性必须为常量,前面为final修饰符,4,接口的语法声明格式为interface接口名称{…//属性常量…//抽象方法},5.1.1接口的声明,接口,5,声明一个接口Shape2D,实现类为Circle和Rectangle把计算面积的方法声明在接口里pi值是常量,把它声明在接口的数据成员里interfaceShape2D{//声明Shape2D接口finaldoublepi=3.14;//数据成员一定要初始化publicabstractdoublearea();//抽象方法}在接口的声明中,允许省略一些关键字,也可声明如下(,省略抽象)interfaceShape2D{doublepi=3.14;//省略常量的final修饰doublearea();//省略抽象方法的publicabstract修饰},5.1.1接口的声明——例5_2,接口,6,5.1.2实现接口,接口的实现不能使用new直接创建接口的对象。其它类使用implements关键字实现接口,本质是实现接口的抽象方法。语法如下publicclass类名称implements接口名{抽象方法头部{方法的具体实现}},接口,7,5.1.2实现接口——例5_4,classCircleimplementsShape2D{doubleradius;publicCircle(doubler){radius=r;}publicdoublearea(){return(pi*radius*radius);}},classRectangleimplementsShape2D{intwidth,height;publicRectangle(intw,inth){width=w;height=h;}publicdoublearea(){return(width*height);}},声明Circle与Rectangle两个类实现Shape2D接口,,接口,8,测试类publicclassInterfaceTester{publicstaticvoidmain(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运行结果,接口,9,声明接口类型的变量,并用它来访问对象publicclassVariableTester{publicstaticvoidmain(String[]args){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,接口,10,5.1.3接口的作用,接口的作用封装相关或不相关类之间的共同属性和方法。实现多继承。,接口,11,,保险公司的例子(不相关类)具有车辆保险、人员保险、公司保险等多种保险业务,在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable接口在UML图中,实现接口用带有空三角形的虚线表示,5.1.3接口的作用——例5_1,接口,12,5.1.3接口的作用--多重继承,多重继承一个类只能有一个父类,但允许一个类可以实现多个接口,通过这种机制可实现多重继承。一个类实现多个接口的语法如下[类修饰符]class类名称implements接口1,接口2,…{……},接口,13,声明Circle类实现接口Shape2D和ColorShape2D具有pi与area()方法,用来计算面积Color则具有setColor方法,可用来赋值颜色通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了多重继承的目的interfaceShape2D{//声明Shape2D接口finaldoublepi=3.14;//数据成员一定要初始化publicabstractdoublearea();//抽象方法}interfaceColor{voidsetColor(Stringstr);//抽象方法},5.1.3接口的作用--多重继承——例5_6,接口,14,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,15,测试类publicclassMultiInterfaceTester{publicstaticvoidmain(Stringargs[]){Circlecir;cir=newCircle(2.0);cir.setColor("blue");System.out.println("Area="+cir.area());}}输出结果color=blueArea=12.56,接口,5.1.3接口的作用--多重继承——例5_6运行结果,16,5.1.4接口的继承(扩展),接口的继承子接口继承父接口。接口继承的语法,支持多重继承interface子接口extends父接口1,父接口2,…{……}实现接口的类也必须实现此接口的父接口,接口,17,,Shape是父接口,Shape2D与Shape3D是其子接口。Circle类及Rectangle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D,5.1.4接口的扩展——例5_7,接口,18,部分代码如下//声明Shape接口interfaceShape{doublepi=3.14;voidsetColor(Stringstr);}//声明Shape2D接口扩展了Shape接口interfaceShape2DextendsShape{doublearea();},5.1.4接口的扩展——例5_7,接口,19,classCircleimplementsShape2D{doubleradius;Stringcolor;publicCircle(doubler){radius=r;}publicdoublearea(){return(pi*radius*radius);}publicvoidsetColor(Stringstr){color=str;System.out.println("color="+color);}}publicclassExtendsInterfaceTester{//测试类publicstaticvoidmain(String[]args){Circlecir;cir=newCircle(2.0);cir.setColor("blue");System.out.println("Area="+cir.area());}},5.1.4接口的扩展——例5_7,接口,20,,运行结果color=blueArea=12.56说明首先声明了父接口Shape,然后声明其子接口Shape2D之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与area()方法的处理方式最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法,5.1.4接口的扩展——例5_7运行结果,接口,21,5.2塑型,塑型(type-casting)又称为类型转换方式隐式(自动)的类型转换显式(强制)的类型转换,22,,5.2.1塑型的概念,塑型的对象包括基本数据类型将值从一种形式转换成另一种形式对象只能被塑型为父类类型对象所属的类实现的接口被塑型为父类或接口后,再被塑型回其本身,塑型,23,Manager对象可以被塑型为Employee、Person、Object或Insurable,不能被塑型为Customer、Company或Car,5.2.1塑型的概念——一个例子,塑型,24,基本数据类型相容类型之间存储容量低的自动向存储容量高的类型转换对象被塑型成父类Employeeemp;emp=newManager();//将Manage对象塑型为Employee对象被塑型为所实现的接口类型Carjetta=newCar();Insurableitem=jetta;,5.2.1塑型的概念——隐式(自动)的类型转换,塑型,25,5.2.1塑型的概念——显式(强制)的类型转换,基本数据类型(int)871.34354;//结果为871(char)65;//结果为‘A’(long)453;//结果为453L对象(还原功能)Employeeemp;Managerman;emp=newManager();man=(Manager)emp;//将emp强制塑型为本来的类型,塑型,26,,5.2.2塑型的应用,塑型应用的场合包括赋值转换赋值号右边的表达式类型或对象转换为左边的类型方法调用转换实参的类型转换为形参的类型算数表达式转换算数混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串,塑型,27,,当一个类对象被塑型为其父类后,它提供的方法会减少当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法将其塑型为本来的类型后,又能接收getSalary()方法了,5.2.2塑型的应用,塑型,28,5.2.3方法的查找,如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法?实例方法的查找类方法的查找,塑型,29,,从对象创建时的类开始,沿类层次向上查找,Managerman=newManager();Employeeemp1=newEmployee();Employeeemp2=(Employee)man;putePay();//调用Employee类中的computePay()方法putePay();//调用Manager类中的computePay()方法putePay();//调用Manager类中的computePay()方法,5.2.3方法的查找——实例方法的查找,塑型,30,,总是在引用变量声明时所属的类中进行查找,Managerman=newManager();Employeeemp1=newEmployee();Employeeemp2=(Employee)man;man.expenseAllowance();//inManageremp1.expenseAllowance();//inEmployeeemp2.expenseAllowance();//inEmployee!!!,5.2.3方法的查找——类方法的查找,塑型,31,5.3多态的概念,多态(相同的方法,不同的实现)。一个类中方法的重载。(例如:一个类中多个构造方法。)多个子类对父类方法重写(draw).执行时,子类对象c向上塑性为父类的对象f。父类对象调用重写方法即f.draw,实际上调用的是子类的重写方法,相当于c.draw.,32,5.3多态的概念——一个例子,多态的概念,Shapes=newCircle();//圆向上塑性为图形s.draw();//调用圆的画法s=newSquare();//正方形向上塑性为图形s.draw();//调用正方形的画法,33,5.3.1多态的实现技术---动态绑定,动态绑定运行时,将方法的调用同定义该方法的类连接到一起。Shapes=newCircle();//圆向上塑性为图形s.draw();//调用圆的画法s=newSquare();//正方形向上塑性为图形s.draw();//调用正方形的画法编译时,无法确定draw方法与谁绑定,运行好,通过new创建对象,实现动态绑定。,多态的概念,34,仍以绘图为例,所有类都放在binding包中基类Shape建立了一个通用接口classShape{voiddraw(){}voiderase(){}}派生类覆盖了draw方法,为每种特殊的几何形状都提供独一无二的行为classCircleextendsShape{voiddraw(){System.out.println("Circle.draw()");}voiderase(){System.out.println("Circle.erase()");}},5.3.2动态绑定——例5_8,多态的概念,35,classSquareextendsShape{voiddraw(){System.out.println("Square.draw()");}voiderase(){System.out.println("Square.erase()");}}classTriangleextendsShape{voiddraw(){System.out.println("Triangle.draw()");}voiderase(){System.out.println("Triangle.erase()");}},5.3.2动态绑定——例5_8,多态的概念,36,对动态绑定进行测试如下publicclassBindingTester{publicstaticvoidmain(String[]args){Shapes=newShape();intn;n=(int)(Math.random()*3);switch(n){case0:s=newCircle();break;case1:s=newSquare();break;case2:s=newTriangle();}}s.draw();}},5.3.2动态绑定——例5_8,多态的概念,37,,运行结果Square.draw()说明编译时无法知道s数组元素的具体类型,运行时才能确定类型,所以是动态绑定在主方法的循环体中,每次随机生成指向一个Circle、Square或者Triangle的引用,5.3.2动态绑定——例5_8运行结果,多态的概念,38,5.4多态的应用,多态的应用技术基础向上塑型技术:一个父类的引用变量可以指向不同的子类对象动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性,多态的概念,39,声明一个抽象类Driver及两个子类FemaleDriver及MaleDriver在Diver类中声明了抽象方法drives,在两个子类中对这个方法进行了重写publicabstractclassDriver{publicDriver(){}publicabstractvoiddrives();},5.4多态的应用(续)——例5_9,多态的概念,40,publicclassFemaleDriverextendsDriver{publicFemaleDriver(){}publicvoiddrives(){System.out.println("AFemaledriverdrivesavehicle.");}}publicclassMaleDriverextendsDriver{publicMaleDriver(){}publicvoiddrives(){System.out.println("Amaledriverdrivesavehicle.");}},5.4多态的应用(续)——例5_9,多态的概念,41,publicclassTest1{staticpublicvoidmain(String[]args){Drivera=newFemaleDriver();Driverb=newMaleDriver();a.drives();b.drives();}}运行结果AFemaledriverdrivesavehicle.Amaledriverdrivesavehicle.,5.4多态的应用(续)——例5_9,多态的概念,42,所有类都放在drive包中试想有不同种类的交通工具(vehicle),如公共汽车(bus)及小汽车(car),由此可以声明一个抽象类Vehicle及两个子类Bus及Car对前面的drives方法进行改进,使其接收一个Vehicle类的参数,当不同类型的交通工具被传送到此方法时,可以输出具体的交通工具,5.4多态的应用(续)——例5_9改进,多态的概念,43,测试代码可改写如下:publicclassDriverTest{staticpublicvoidmain(String[]args){Drivera=newFemaleDriver();Driverb=newMaleDriver();Vehiclex=newCar();Vehicley=newBus();a.drives(x);b.drives(y);}}并希望输出下面的结果AfemaledriverdrivesaCar.Amaledriverdrivesabus.,5.4多态的应用(续)——例5_9改进,多态的概念,44,Vehicle及其子类声明如下publicabstractclassVehicle{privateStringtype;publicVehicle(){}publicVehicle(Strings){type=s;}publicabstractvoiddrivedByFemaleDriver();publicabstractvoiddrivedByMaleDriver();},5.4多态的应用(续)——例5_9改进,多态的概念,45,publicclassBusextendsVehicle{publicBus(){}publicvoiddrivedByFemaleDriver(){System.out.println("Afemaledriverdrivesabus.");}publicvoiddrivedByMaleDriver(){System.out.println("Amaledriverdrivesabus.");}}publicclassCarextendsVehicle{publicCar(){}publicvoiddrivedByFemaleDriver(){System.out.println("AFemaledriverdrivesacar.");}publicvoiddrivedByMaleDriver(){System.out.println("AMaledriverdrivesacar.");}},5.4多态的应用(续)——例5_9改进,多态的概念,46,,对FemaleDriver及MaleDriver类中的drives方法进行改进,在drives方法的定义体中不直接输出结果,而是调用Bus及Car类中的相应方法publicabstractclassDriver{publicDriver(){}publicabstractvoiddrives(Vehiclev);}publicclassFemaleDriverextendsDriver{publicFemaleDriver(){}publicvoiddrives(Vehiclev){v.drivedByFemaleDriver();}}publicclassMaleDriverextendsDriver{publicMaleDriver(){}publicvoiddrives(Vehiclev){v.drivedByMaleDriver();}},5.4多态的应用(续)——例5_9改进,多态的概念,47,运行结果AFemaledriverdrivesacar.Amaledriverdrivesabus.说明这种技术称为二次分发(“doubledispatching”),即对输出消息的请求被分发两次首先根据驾驶员的类型被发送给一个类之后根据交通工具的类型被发送给另一个类,5.4多态的应用(续)——例5_9改进运行结果,多态的概念,48,5.5构造方法与多态,构造方法与多态构造方法并不具有多态性,但仍然非常有必要理解构造方法如何在复杂的分级结构中随同多态性一同使用的情况,49,构造方法的执行顺序执行基类的构造方法,基类成员变量初始化。执行派生构造方法,派生类成员变量初始化。,5.5.1构造方法的执行顺序,构造方法与多态,50,构建一个点类Point,一个球类Ball,一个运动的球类MovingBall继承自BallpublicclassPoint{privatedoublex;privatedoubley;publicPoint(){}publicPoint(doublex1,doubley1){x=x1;y=y1;}publicStringtoString(){return“x轴坐标为”+x+”y轴坐标为”+y;}},5.5.1构造方法的执行顺序(续)——例5_10,构造方法与多态,51,publicclassBall{privatePointcenter;//中心点privatedoubleradius;//半径privateStringcolour;//颜色publicBall(){}publicBall(doublex1,doubley1,doubler){center=newPoint(x1,y1);//调用Point中的构造方法radius=r;}publicBall(doublex1,doubley1,doubler,Stringc){this(x1,y1,r);//调用三个参数的构造方法colour=c;}publicStringtoString(){return“球中心点”+center.toString()+”,半径为”+r+”,颜色为”+colour;}},5.5.1构造方法的执行顺序(续)——例5_10,构造方法与多态,52,,publicclassMovingBallextendsBall{privatedoublespeed;publicMovingBall(){}publicMovingBall(doublex1,doubley1,doubler,Stringc,doubles){super(x1,y1,r,c);speed=s;}publicStringtoString(){returnsuper.toString()+“,速度"+speed);}},5.5.1构造方法的执行顺序(续)——例5_10,构造方法与多态,53,publicclassTester{publicstaticvoidmain(Stringargs[]){MovingBallmb=newMovingBall(10,20,40,"green",25);System.out.println(mb);}}运行结果球中心点x轴坐标为10,y轴坐标为20,半径为40.0,颜色为green,速度为25.0,5.5.1构造方法的执行顺序(续)——例5_10运行结果,构造方法与多态,54,构造方法中的多态方法在父类构造方法内调用重写的方法(子类动态绑定的方法)。这种情况要避免出现。,构造方法与多态,5.5.2构造方法中的多态方法,55,构造方法与多态,在Shap2D中声明一个抽象方法,并在构造方法内部调用之abstractclassShap2D{abstractvoiddraw();Shap2D(){System.out.println(“Shap2D的构造方法执行");draw();System.out.println(“Shap2D的构造方法结束");}},5.5.2构造方法中的多态方法(续)——例5_12,56,classCircleextendsShap2D{intradius=1;Circle(intr){radius=r;System.out.println(“Circle的构造方法,半径="+radius);}voiddraw(){System.out.println(“Circle的draw方法,半径="+radius);}}publicclassPolyConstructors{publicstaticvoidmain(String[]args){newCircle(5);}},5.5.2构造方法中的多态方法(续)——例5_12,构造方法与多态,57,运行结果Shap2D的构造方法执行Circle的draw方法,半径=0Shap2D的构造方法结束Circle的构造方法,半径=5,构造方法与多态,5.5.2构造方法中的多态方法(续)——例5_12运行结果,- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java语言程序设计 java 语言程序设计

相关资源
更多
相关搜索
链接地址:https://www.zhuangpeitu.com/p-11802352.html