Java学习课件第5章.ppt
《Java学习课件第5章.ppt》由会员分享,可在线阅读,更多相关《Java学习课件第5章.ppt(92页珍藏版)》请在三一办公上搜索。
1、第5章 接口与多态,郑莉,Programming in JAVA,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+中的多继承那样的复杂性建立类和类之
2、间的“协议”把类根据其实现的功能来分别代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节实现不同类之间的常量共享,接口,5,接口允许我们在看起来不相干的对象之间定义共同行为,5.1.1 接口的作用及语法与抽象类的不同,接口,6,保险公司的例子具有车辆保险、人员保险、公司保险等多种保险业务,在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable 接口在UML图中,实现接口用带有空三角形的虚线表示,5.1.1 接口的作用及语法例5_1,接口,7,接口的语法声明格式为接口修饰符 interface 接口名称 extends
3、 父接口名/方法的原型声明或静态常量接口的数据成员一定要赋初值,且此值将不能再更改,允许省略final关键字接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字,5.1.1 接口的作用及语法,接口,8,例5.1中的Insurable 接口声明如下,可见其中的方法都是抽象方法 public interface Insurable public int getNumber();public int getCoverageAmount();public double calculatePremium();public Date getExpiryDate();,
4、5.1.1 接口的作用及语法 例5_1保险接口的声明,接口,9,声明一个接口Shape2D,可利用它来实现二维的几何形状类Circle和Rectangle把计算面积的方法声明在接口里pi值是常量,把它声明在接口的数据成员里interface Shape2D/声明Shape2D接口 final double pi=3.14;/数据成员一定要初始化 public abstract double area();/抽象方法在接口的声明中,允许省略一些关键字,也可声明如下interface Shape2D double pi=3.14;double area();,5.1.1 接口的作用及语法例5_2,
5、接口,10,5.1.2 实现接口,接口的实现接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象利用接口设计类的过程,称为接口的实现,使用implements关键字语法如下public class 类名称 implements 接口名称/*Bodies for the interface methods*/*Own data and methods.*/必须实现接口中的所有方法来自接口的方法必须声明成public,接口,11,实现接口Insurable,声明汽车类实现例5.1中的Insurable接口,实现接口中的所有抽象方法public class Car imp
6、lements Insurable public int getPolicyNumber()/write code here public double calculatePremium()/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,接口,12,对象可以被转型为其所属类实现的接口类型getPolicy
7、Number、calculatePremium是Insurable接口中声明的方法getMileage是Car类新添加的方法,Insurable接口中没有声明此方法Car jetta=new Car();Insurable item=(Insurable)jetta;/对象转型为接口类型 item.getPolicyNumber();item.calculatePremium();item.getMileage();/接口中没有声明此方法,不可以jetta.getMileage();/类中有此方法,可以(Car)item).getMileage();/转型回原类,可调用此方法了,5.1.2 实
8、现接口 对象转型,接口,13,5.1.2 实现接口 例5_4,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);,声明Cir
9、cle与Rectangle两个类实现Shape2D接口,接口,14,测试类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.0Area of cir=12.56,5.1.2 实现接口
10、 例5_4运行结果,接口,15,声明接口类型的变量,并用它来访问对象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.0Area of var2=12.56,5.1.2 实现接
11、口 例5_5,接口,16,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接口,接口,17,Plane、Car、Train、Boat 分别实现 MovableObject 接口p
12、ublic 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 fuelRemaining()/返回燃料剩余量 public void chang
13、eSpeed(double kmPerHour)/改变速度/plane类自己的方法:public Date getLastRepairDate()/.public double calculateWindResistance()/.,5.1.2 实现接口 MovableObject接口的实现,接口,18,为 MovableObjects安装遥控器(remote control)public class RemoteControl private MovableObjectmachine;RemoteControl(MovableObject m)machine=m;/按下“启动”按钮:publ
14、ic void start()boolean okay=machine.start();if(!okay)display(No Response on start);/.remote control 构造方法的形参类型为 MovableObject,它可以是Plane,Car,Train,Boat,等等,5.1.2 实现接口 RemoteControl类,接口,19,5.1.3 多重继承,多重继承Java的设计以简单实用为导向,不允许一个类有多个父类但允许一个类可以实现多个接口,通过这种机制可实现多重继承一个类实现多个接口的语法如下类修饰符 class 类名称 implements 接口1,接
15、口2,接口,20,Car类可以实现接口Insurable,Drivable,Sellablepublic class Car implements Insurable,Drivable,Sellable.,5.1.3 多重继承 Car的例子,接口,21,声明Circle类实现接口Shape2D和ColorShape2D具有pi与area()方法,用来计算面积Color则具有setColor方法,可用来赋值颜色通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了多重继承的目的interface Shape2D/声明Shape2D接口 final double pi=3.14;/
16、数据成员一定要初始化 public abstract double area();/抽象方法interface Color void setColor(String str);/抽象方法,5.1.3 多重继承 例5_6,接口,22,class Circle implements Shape2D,Color/实现Circle类 double radius;String color;public Circle(double r)/构造方法 radius=r;public double area()/定义area()的处理方式 return(pi*radius*radius);public void
17、 setColor(String str)/定义setColor()的处理方式 color=str;System.out.println(color=+color);,接口,5.1.3 多重继承 例5_6,23,测试类public class MultiInterfaceTester public static void main(String args)Circle cir;cir=new Circle(2.0);cir.setColor(blue);System.out.println(Area=+cir.area();输出结果color=blueArea=12.56,接口,5.1.3 多
18、重继承 例5_6运行结果,24,5.1.4 接口的扩展,接口的扩展接口可通过扩展的技术派生出新的接口原来的接口称为基本接口(base interface)或父接口(super interface)派生出的接口称为派生接口(derived interface)或子接口(sub interface)派生接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要实现接口的类也必须实现此接口的父接口接口扩展的语法interface 子接口的名称 extends 父接口的名称1,父接口的名称2,,接口,25,Shape是父接口,Shape2D与Shape3D是其子接口。Circle类及Rect
19、angle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D,5.1.4 接口的扩展 例5_7,接口,26,部分代码如下/声明Shape接口interface Shape double pi=3.14;void setColor(String str);/声明Shape2D接口扩展了Shape接口interface Shape2D extends Shape double area();,5.1.4 接口的扩展 例5_7,接口,27,class Circle implements Shape2D double radius;String color;public Cir
20、cle(double r)radius=r;public double area()return(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.are
21、a();,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接口实现它们类也必须实现In
22、surable接口中的所有方法public interface DepreciatingInsurable extends Insurable public double computeFairMarketValue();public interface FixedInsurable extends Insurable public int getEvaluationPeriod();,5.1.4 接口的扩展 Insurable接口的例子,接口,30,5.2 塑型,塑型(type-casting)又称为类型转换方式隐式(自动)的类型转换显式(强制)的类型转换,31,5.2.1 塑型的概念,塑型
23、的对象包括基本数据类型将值从一种形式转换成另一种形式引用变量将对象暂时当成更一般的对象来对待,并不改变其类型只能被塑型为任何一个父类类型对象所属的类实现的一个接口被塑型为父类或接口后,再被塑型回其本身所在的类,塑型,32,Manager对象可以被塑型为Employee、Person、Object或Insurable,不能被塑型为Customer、Company或Car,5.2.1 塑型的概念 一个例子,塑型,33,基本数据类型相容类型之间存储容量低的自动向存储容量高的类型转换引用变量被塑型成更一般的类Employee emp;emp=new Manager();/将Manager类型的对象直接
24、赋给/Employee类的引用变量,系统会/自动将Manage对象塑型为Employee类被塑型为对象所属类实现的接口类型Car jetta=new Car();Insurable item=jetta;,5.2.1 塑型的概念 隐式(自动)的类型转换,塑型,34,5.2.1 塑型的概念 显式(强制)的类型转换,基本数据类型(int)871.34354;/结果为 871(char)65;/结果为A(long)453;/结果为453L引用变量:还原为本来的类型Employee emp;Manager man;emp=new Manager();man=(Manager)emp;/将emp强制塑型
25、为本来的类型,塑型,35,5.2.2 塑型的应用,塑型应用的场合包括赋值转换赋值号右边的表达式类型或对象转换为左边的类型方法调用转换实参的类型转换为形参的类型算数表达式转换算数混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串,塑型,36,当一个类对象被塑型为其父类后,它提供的方法会减少当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法将其塑型为本来的类型后,又能接收getSalary()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 学习 课件
链接地址:https://www.31ppt.com/p-5436075.html