收藏 分销(赏)

Java学习精-第5章ppt课件.ppt

上传人:二*** 文档编号:7999217 上传时间:2025-01-30 格式:PPT 页数:92 大小:432KB
下载 相关 举报
Java学习精-第5章ppt课件.ppt_第1页
第1页 / 共92页
亲,该文档总共92页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,*,单击此处编辑母版标题样式,清华大学 郑莉,JAVA,语言程序设计,第,5,章,接口与多态,郑莉,Programming in JAVA,1,.,目录,5.1 接口,5.2 塑型,5.3 多态的概念,5.4 多态的应用,5.5 构造方法与多态,5.6 内部类,5.7 本章小结,2,.,5.1 接口,接口,与抽象类一样都是定义多个类的共同属性,使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现,允许创建者规定,方法,的基本形式:,方法名,、,参数列表,以及,返回类型,,但不规定方法主体,也可以包含基本

2、数据类型的,数据成员,,但它们都默认为,static,和,final,3,.,5.1.1 接口的作用及语法,接口的作用,是面向对象的一个重要机制,实现多继承,同时免除,C+,中的多继承那样的复杂性,建立类和类之间的“协议”,把类根据其实现的功能来分别代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节,实现不同类之间的常量共享,接口,4,.,接口允许我们在看起来不相干的对象之间定义共同行为,5.1.1 接口的作用及语法,与抽象类的不同,接口,5,.,保险公司的例子,具有车辆保险、人员保险、公司保险等多种保险业务,在对外提供服务方面具有相似性,如都需要计算保险费(,p

3、remium),等,因此可声明一个,Insurable,接口,在,UML,图中,实现接口用带有空三角形的虚线表示,5.1.1 接口的作用及语法,例5_1,Insurable,Company,Person,Car,接口,6,.,接口的语法,声明格式为,接口修饰符,interface,接口名称,extends,父接口名,/方法的原型声明或静态常量,接口的数据成员一定要赋初值,且此值将不能再更改,允许省略,final,关键字,接口中的方法必须是“抽象方法”,不能有方法体,允许省略,public,及,abstract,关键字,5.1.1 接口的作用及语法,接口,7,.,例5.1中的,Insurable

4、,接口声明如下,可见其中的方法都是抽象方法,public interface Insurable ,public int getNumber();,public int getCoverageAmount();,public double calculatePremium();,public Date getExpiryDate();,5.1.1 接口的作用及语法,例5_1保险接口的声明,接口,8,.,声明一个接口,Shape2D,,可利用它来实现二维的几何形状类,Circle,和,Rectangle,把计算面积的方法声明在接口里,pi,值是常量,把它声明在接口的数据成员里,interface

5、 Shape2D /,声明,Shape2D,接口,final double pi=3.14;/,数据成员一定要初始化,public abstract double area();/,抽象方法,在接口的声明中,允许省略一些关键字,也可声明如下,interface Shape2D,double pi=3.14;,double area();,5.1.1 接口的作用及语法,例5_2,接口,9,.,5.1.2 实现接口,接口的实现,接口不能用,new,运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象,利用接口设计类的过程,称为接口的实现,使用,implements,关键字,语法如下,p

6、ublic class,类名称,implements,接口名称,/*,Bodies for the interface methods*/,/*Own data and methods.*/,必须实现接口中的所有方法,来自接口的方法必须声明成,public,接口,10,.,实现接口,Insurable,,声明汽车类实现例5.1中的,Insurable,接口,实现接口中的所有抽象方法,public class Car implements Insurable,public int getPolicyNumber(),/write code here,public double calculate

7、Premium(),/write code here,public Date getExpiryDate(),/write code here,public int getCoverageAmount(),/write code here,public int getMileage()/,新添加的方法,/write code here,5.1.2 实现接口,例5_3,接口,11,.,对象可以被转型为其所属类实现的接口类型,getPolicyNumber,、,calculatePremium,是,Insurable,接口中声明的方法,getMileage,是,Car,类新添加的方法,,Insur

8、able,接口中没有声明此方法,Car,jetta,=new Car();,Insurable,item,=,(Insurable),jetta;,/,对象转型为接口类型,item,.,getPolicyNumber(),;,item,.,calculatePremium(),;,item,.,getMileage(),;,/,接口中没有声明此方法,不可以,jetta,.,getMileage(),;,/,类中有此方法,可以,(,(Car),item).,getMileage(),;,/,转型回原类,可调用此方法了,5.1.2 实现接口,对象转型,接口,12,.,5.1.2 实现接口,例5_4

9、,class Circle,implements,Shape2D,double radius;,public Circle(double r),radius=r;,public double,area(),return(,pi,*radius*radius);,class Rectangle,implements,Shape2D,int width,height;,public Rectangle(int w,int h),width=w;,height=h;,public double,area(),return(width*height);,声明,Circle,与,Rectangle,两个

10、类实现,Shape2D,接口,接口,13,.,测试类,public class InterfaceTester,public static void main(String args),Rectangle rect=new Rectangle(5,6);,System.out.println(Area of rect=+rect.area();,Circle cir=new Circle(2.0);,System.out.println(Area of cir=+cir.area();,运行结果,Area of rect=30.0,Area of cir=12.56,5.1.2 实现接口,例5

11、_4运行结果,接口,14,.,声明接口类型的变量,并用它来访问对象,public class VariableTester,public static void main(String args),Shape2D var1,var2,;,var1=new Rectangle(5,6);,System.out.println(Area of var1=+var1.area();,var2=new Circle(2.0);,System.out.println(Area of var2=+var2.area();,输出结果,Area of var1=30.0,Area of var2=12.56,

12、5.1.2 实现接口,例5_5,接口,15,.,MovableObject,接口定义了所有“可移动对象”能做的事情,public interface MovableObject,public boolean start();public void stop();public boolean turn(int degrees);public double fuelRemaining();public void,changeSpeed(double kmPerHour);,5.1.2 实现接口,MovableObject,接口,接口,16,.,Plane、Car、Train、Boat,分别实现,M

13、ovableObject,接口,public class Plane implements MovableObject,public int seatCapacity;,public Company owner;,public DatelastRepairDate;,/,实现,MovalbelObject,接口的所有方法,public boolean start()/,启动飞机,成功则返回,true ,public void stop()/,停止,public boolean turn(int degrees)/,转向,成功则返回,true,public double fuelRemainin

14、g()/,返回燃料剩余量,public void changeSpeed(double kmPerHour)/,改变速度,/plane,类自己的方法:,public Date getLastRepairDate()/.,public double calculateWindResistance()/.,5.1.2 实现接口,MovableObject,接口的实现,接口,17,.,为,MovableObjects,安装遥控器(,remote control),public class RemoteControl private,MovableObjectmachine,;,RemoteContr

15、ol(,MovableObject m,)machine=m;/,按下“启动,”,按钮:,public void start(),boolean okay=machine.start();if(!okay)display(No Response on start);/.,remote control,构造方法的形参类型为,MovableObject,,它可以是,Plane,Car,Train,Boat,等等,5.1.2 实现接口,RemoteControl,类,接口,18,.,5.1.3 多重继承,多重继承,Java,的设计以简单实用为导向,不允许一个类有多个父类,但允许一个类可以实现多个接口

16、,通过这种机制可实现多重继承,一个类实现多个接口的语法如下,类修饰符,class,类名称,implements,接口1,接口2,接口,19,.,Car,类可以实现接口,Insurable,Drivable,Sellable,public class Car implements Insurable,Drivable,Sellable,.,5.1.3 多重继承,Car,的例子,接口,20,.,声明,Circle,类实现接口,Shape2D,和,Color,Shape2D,具有,pi,与,area(),方法,用来计算面积,Color,则具有,setColor,方法,可用来赋值颜色,通过实现这两个接

17、口,,Circle,类得以同时拥有这两个接口的成员,达到了多重继承的目的,interface Shape2D /,声明,Shape2D,接口,final double pi=3.14;/,数据成员一定要初始化,public abstract double area();/,抽象方法,interface Color,void setColor(String str);/,抽象方法,5.1.3 多重继承,例5_6,接口,21,.,class Circle,implements,Shape2D,Color /,实现,Circle,类,double radius;,String color;,publ

18、ic Circle(double r)/,构造方法,radius=r;,public double,area(),/,定义,area(),的处理方式,return(pi*radius*radius);,public void,setColor(String str),/,定义,setColor(),的处理方式,color=str;,System.out.println(color=+color);,接口,5.1.3 多重继承,例5_6,22,.,测试类,public class MultiInterfaceTester,public static void main(String args),

19、Circle cir;,cir=new Circle(2.0);,cir.,setColor,(blue);,System.out.println(Area=+cir.,area,();,输出结果,color=blue,Area=12.56,接口,5.1.3 多重继承,例5_6运行结果,23,.,5.1.4 接口的扩展,接口的扩展,接口可通过扩展的技术派生出新的接口,原来的接口称为基本接口(,base interface),或父接口(,super interface),派生出的接口称为派生接口(,derived interface),或子接口(,sub interface),派生接口不仅可以保

20、有父接口的成员,同时也可加入新成员以满足实际问题的需要,实现接口的类也必须实现此接口的父接口,接口扩展的语法,interface,子接口的名称,extends,父接口的名称1,父接口的名称2,,接口,24,.,Shape,是父接口,,Shape2D,与,Shape3D,是其子接口。,Circle,类及,Rectangle,类实现接口,Shape2D,,而,Box,类及,Sphere,类实现接口,Shape3D,5.1.4 接口的扩展,例5_7,Shape,接口,Shape2D,接口,Shape3D,接口,Sphere,类,Box,类,Rectangle,类,Circle,类,接口,25,.,部

21、分代码如下,/,声明,Shape,接口,interface Shape,double pi=3.14;,void setColor(String str);,/,声明,Shape2D,接口扩展了,Shape,接口,interface Shape2D,extends,Shape,double area();,5.1.4 接口的扩展,例5_7,接口,26,.,class Circle implements Shape2D,double radius;,String color;,public Circle(double r),radius=r;,public double,area(),retur

22、n(pi*radius*radius);,public void,setColor(String str),color=str;,System.out.println(color=+color);,public class ExtendsInterfaceTester /,测试类,public static void main(String args),Circle cir;,cir=new Circle(2.0);,cir.,setColor(blue),;,System.out.println(Area=+cir.,area(),);,5.1.4 接口的扩展,例5_7,接口,27,.,运行

23、结果,color=blue,Area=12.56,说明,首先声明了父接口,Shape,,然后声明其子接口,Shape2D,之后声明类,Circle,实现,Shape2D,子接口,因而在此类内必须明确定义,setColor(),与,area(),方法的处理方式,最后在主类中我们声明了,Circle,类型的变量,cir,并创建新的对象,最后通过,cir,对象调用,setColor(),与,area(),方法,5.1.4 接口的扩展,例5_7运行结果,接口,28,.,FixedInsurable,和,DepreciatingInsurable,接口,都继承了,Insurable,接口,实现它们类也必

24、须实现,Insurable,接口中的所有方法,public,interface,DepreciatingInsurable,extends,Insurable public double computeFairMarketValue();,public,interface,FixedInsurable,extends,Insurable public int getEvaluationPeriod();,5.1.4 接口的扩展,Insurable,接口的例子,接口,29,.,5.2 塑型,塑型(,type-casting),又称为类型转换,方式,隐式(自动)的类型转换,显式(强制)的类型转换,

25、30,.,5.2.1 塑型的概念,塑型的对象包括,基本数据类型,将值从一种形式转换成另一种形式,引用变量,将对象暂时当成更一般的对象来对待,并不改变其类型,只能被塑型为,任何一个父类类型,对象所属的类实现的一个接口,被塑型为父类或接口后,再被塑型回其本身所在的类,塑型,31,.,Manager,对象,可以被塑型为,Employee、Person、Object,或,Insurable,,,不能被塑型为,Customer、Company,或,Car,Object,Person,Employee,Customer,Manager,Company,Car,Insurable,5.2.1 塑型的概念,一

26、个例子,塑型,32,.,基本数据类型,相容类型之间存储容量低的自动向存储容量高的类型转换,引用变量,被塑型成更一般的类,Employee emp;,emp=new Manager();/,将,Manager,类型的对象直接赋给,/Employee,类的引用变量,系统会,/自动,将,Manage,对象,塑型为,Employee,类,被塑型为对象所属类实现的接口类型,Car jetta=new Car();,Insurable item=jetta;,5.2.1 塑型的概念,隐式(自动)的类型转换,塑型,33,.,5.2.1 塑型的概念,显式(强制)的类型转换,基本数据类型,(,int)871.3

27、4354;/,结果为 871,(,char)65;/,结果为,A,(long)453;/,结果为453,L,引用变量:还原为本来的类型,Employee emp;,Manager man;,emp=new Manager();,man=(Manager)emp;/,将,emp,强制塑型为本来的类型,塑型,34,.,5.2.2 塑型的应用,塑型应用的场合包括,赋值转换,赋值号右边的表达式类型或对象转换为左边的类型,方法调用转换,实参的类型转换为形参的类型,算数表达式转换,算数混合运算时,不同类型的项转换为相同的类型再进行运算,字符串转换,字符串连接运算时,如果一个操作数为字符串,一个操作数为数值

28、型,则会自动将数值型转换为字符串,塑型,35,.,当一个类对象被塑型为其父类后,它提供的方法会减少,当,Manager,对象被塑型为,Employee,之后,它只能接收,getName(),及,getEmployeeNumber(),方法,不能接收,getSalary(),方法,将其塑型为本来的类型后,又能接收,getSalary(),方法了,5.2.2 塑型的应用,塑型,36,.,5.2.3 方法的查找,如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法,?,实例方法的查找,类方法的查找,塑型,37,.,从对象创建时的类开始,沿类层

29、次向上查找,Manager man,=new Manager();,Employee emp1,=new Employee();,Employee emp2,=(Employee)man;,emp1,.computePay();,/,调用,Employee,类中的,computePay(),方法,man,.computePay();,/,调用,Manager,类中的,computePay(),方法,emp2,.computePay();,/,调用,Manager,类中的,computePay(),方法,5.2.3 方法的查找,实例方法的查找,塑型,38,.,总是在引用变量声明时所属的类中进行查

30、找,Manager man,=new Manager();,Employee emp1,=new Employee();,Employee emp2,=(Employee)man;,man,.expenseAllowance();/in Manager,emp1,.expenseAllowance();/in Employee,emp2,.expenseAllowance();/in Employee!,5.2.3 方法的查找,类方法的查找,塑型,39,.,5.3 多态的概念,多态,是指不同类型的对象可以响应相同的消息,从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进

31、行同样的处理,由于多态性,这些,不同派生类对象,响应同一方法时的行为是有所差别的,例如,所有的,Object,类的对象都响应,toString(),方法,所有的,BankAccount,类的对象都响应,deposit(),方法,40,.,5.3.1 多态的目的,多态的目的,所有的对象都可被塑型为相同的类型,响应相同的消息,使代码变得简单且容易理解,使程序具有很好的“扩展性”,多态的概念,41,.,绘图,直接的方式,希望能够画出任意子类型对象的形状,可以在,Shape,类中声明几个绘图方法,,对不同的实际对象,采用不同的画法,if(aShape instanceof Circle)aShape.

32、,drawCircle(),;,if(aShape instanceof Triangle)aShape.,drawTriangle(),;,if(aShape instanceof Rectangle)aShape.,drawRectangle(),;,5.3.1 多态的目的,一个例子,多态的概念,42,.,绘图,更好的方式,在每个子类中都声明同名的,draw(),方法,以后绘图可如下进行,Shape s=new Circle();,s.draw();,Circle,属于,Shape,的一种,系统会执行自动塑型,当调用方法,draw,时,实际调用的是,Circle.draw(),在程序运行时

33、才进行绑定,接下来介绍绑定的概念,5.3.1 多态的目的,一个例子,多态的概念,43,.,5.3.2 绑定的概念,绑定,指将一个方法调用同一个方法主体连接到一起,根据绑定时期的不同,可分为,早期绑定,程序运行之前执行绑定,晚期绑定,也叫作“动态绑定”或“运行期绑定,基于对象的类别,在程序运行时执行绑定,多态的概念,44,.,仍以绘图为例,所有类都放在,binding,包中,基类,Shape,建立了一个通用接口,class,Shape,void draw(),void erase(),派生类覆盖了,draw,方法,为每种特殊的几何形状都提供独一无二的行为,class,Circle,extends

34、,Shape,void draw(),System.out.println(Circle.draw();,void erase(),System.out.println(Circle.erase();,5.3.2 绑定的概念,例5_8,多态的概念,45,.,class,Square,extends,Shape,void draw(),System.out.println(Square.draw();,void erase(),System.out.println(Square.erase();,class,Triangle,extends,Shape,void draw(),System.ou

35、t.println(Triangle.draw();,void erase(),System.out.println(Triangle.erase();,5.3.2 绑定的概念,例5_8,多态的概念,46,.,对动态绑定进行测试如下,public class BindingTester,public static void main(String args),Shape s=new Shape9;,int n;,for(int i=0;i s.length;i+),n=(int)(Math.random()*3);,switch(n),case 0:si=,new Circle(),;brea

36、k;,case 1:si=,new Square(),;break;,case 2:si=,new Triangle(),;,for(int i=0;i 100),System.out.println(Over budget!);,/,不能重载,private String label=,dest,;,public String readLabel()return label;,;,public static void main(String args),Parcel9 p=new Parcel9();,Destination d=p.,dest(Tanzania,101.395F),;,5.6 内部类,匿名的内部类,内部类,91,.,5.7 本章小结,本章内容,接口作用及语法,塑型的概念及应用,多态的概念及引用,构造方法的调用顺序及其中的多态方法,内部内的有关知识,本章要求,理解接口、塑型、多态的概念并能熟练应用,熟练掌握构造方法的调用顺序,理解编写时需要注意的问题,掌握内部类的语法结构及其应用场合,92,.,

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 教育专区 > 初中其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服