清华大学java[1]课件_第1页
清华大学java[1]课件_第2页
清华大学java[1]课件_第3页
清华大学java[1]课件_第4页
清华大学java[1]课件_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1、清华大学java11第第5章章 接口与多态接口与多态Programming in JAVA清华大学 郑莉JAVA语言程序设计清华大学java12目录目录l5.1 接口接口l5.2 塑型塑型l5.3 多态的概念多态的概念l5.4 多态的应用多态的应用l5.5 构造方法与多态构造方法与多态l5.6 内部类内部类l5.7 本章小结本章小结清华大学 郑莉JAVA语言程序设计清华大学java135.1 接口接口l接口接口 与抽象类一样都是定义多个类的共同属性 使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现 允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定

2、方法主体 也可以包含基本数据类型的数据成员,但它们都默认为static和final清华大学 郑莉JAVA语言程序设计清华大学java145.1.1 接口的作用及语法接口的作用及语法l接口的作用接口的作用 是面向对象的一个重要机制 实现多继承,同时免除C+中的多继承那样的复杂性 建立类和类之间的“协议”l把类根据其实现的功能来分别代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节l实现不同类之间的常量共享接口清华大学 郑莉JAVA语言程序设计清华大学java15l接口允许我们在看起来不相干的对象接口允许我们在看起来不相干的对象之间定义共同行为之间定义共同行为5.1.

3、1 接口的作用及语法接口的作用及语法与抽象类的不同与抽象类的不同接口清华大学 郑莉JAVA语言程序设计清华大学java16l保险公司的例子保险公司的例子 具有车辆保险、人员保险、公司保险等多种保险业务,在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable 接口 在UML图中,实现接口用带有空三角形的虚线表示5.1.1 接口的作用及语法接口的作用及语法例例5_1InsurableCompanyPersonCar接口清华大学 郑莉JAVA语言程序设计清华大学java17l接口的语法接口的语法 声明格式为接口修饰符 interface 接口名称 ex

4、tends 父接口名/方法的原型声明或静态常量 接口的数据成员一定要赋初值,且此值将不能再更改,允许省略final关键字 接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字5.1.1 接口的作用及语法接口的作用及语法接口清华大学 郑莉JAVA语言程序设计清华大学java18l例例5.1中的中的Insurable 接口声明如下,接口声明如下,可见其中的方法都是抽象方法可见其中的方法都是抽象方法 public interface Insurable public int getNumber(); public int getCoverageAmount();

5、 public double calculatePremium(); public Date getExpiryDate(); 5.1.1 接口的作用及语法接口的作用及语法 例例5_1保险接口的声明保险接口的声明接口清华大学 郑莉JAVA语言程序设计清华大学java19l声明一个接口声明一个接口Shape2D,可利用它来实现可利用它来实现二维的几何形状类二维的几何形状类Circle和和Rectangle 把计算面积的方法声明在接口里 pi值是常量,把它声明在接口的数据成员里interface Shape2D /声明Shape2D接口 final double pi=3.14; /数据成员一定要

6、初始化 public abstract double area();/抽象方法 在接口的声明中,允许省略一些关键字,也可声明如下interface Shape2D double pi=3.14; double area(); 5.1.1 接口的作用及语法接口的作用及语法例例5_2接口清华大学 郑莉JAVA语言程序设计清华大学java1105.1.2 实现接口实现接口l接口的实现接口的实现接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象利用接口设计类的过程,称为接口的实现,使用implements关键字语法如下public class 类名称 implements

7、 接口名称 /* Bodies for the interface methods */ /* Own data and methods. */ l必须实现接口中的所有方法l来自接口的方法必须声明成public接口清华大学 郑莉JAVA语言程序设计清华大学java111l实现接口实现接口Insurable,声明汽车类实现例声明汽车类实现例5.1中的中的Insurable接口,实现接口中的所有抽象方法接口,实现接口中的所有抽象方法public class Car implements Insurable public int getPolicyNumber() / write code here

8、 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接口清华大学 郑莉JAVA语言程序设计清华大学java112l对象可以被转型为其所属类实现的接口类型对象可以被转型为其所属类实现的接口类型 getPolicyNumbe

9、r、calculatePremium是Insurable接口中声明的方法 getMileage是Car类新添加的方法,Insurable接口中没有声明此方法Car jetta = new Car(); Insurable item = (Insurable)jetta; /对象转型为接口类型 item.getPolicyNumber();item.calculatePremium(); item.getMileage(); / 接口中没有声明此方法,不可以jetta.getMileage(); / 类中有此方法,可以(Car)item).getMileage(); / 转型回原类,可调用此方法

10、了5.1.2 实现接口实现接口 对象转型对象转型接口清华大学 郑莉JAVA语言程序设计清华大学java1135.1.2 实现接口实现接口 例例5_4class 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; h

11、eight=h; public double area() return (width * height); l声明声明Circle与与Rectangle两个类实现两个类实现Shape2D接口接口接口清华大学 郑莉JAVA语言程序设计清华大学java114l测试类测试类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

12、Circle(2.0); System.out.println(Area of cir = + cir.area(); l运行结果运行结果Area of rect = 30.0Area of cir = 12.565.1.2 实现接口实现接口 例例5_4运行结果运行结果接口清华大学 郑莉JAVA语言程序设计清华大学java115l声明接口类型的变量,并用它来访问对象声明接口类型的变量,并用它来访问对象public class VariableTester public static void main(String args) Shape2D var1,var2;var1=new Rectan

13、gle(5,6);System.out.println(Area of var1 = + var1.area();var2=new Circle(2.0);System.out.println(Area of var2 = + var2.area();l输出结果输出结果Area of var1 = 30.0Area of var2 = 12.565.1.2 实现接口实现接口 例例5_5接口清华大学 郑莉JAVA语言程序设计清华大学java116lMovableObject接口定义了所有接口定义了所有“可移动可移动对象对象”能做的事情能做的事情public interface MovableOb

14、ject public boolean start(); public void stop(); public boolean turn(int degrees); public double fuelRemaining(); public void changeSpeed(double kmPerHour);5.1.2 实现接口实现接口 MovableObject接口接口接口清华大学 郑莉JAVA语言程序设计清华大学java117lPlane、Car、 Train、 Boat 分别实现分别实现 MovableObject 接口接口public class Plane implements M

15、ovableObject public int seatCapacity; public Company owner; public Date lastRepairDate; /实现MovalbelObject接口的所有方法 public boolean start() /启动飞机,成功则返回true public void stop() /停止 public boolean turn(int degrees) /转向,成功则返回true public double fuelRemaining() /返回燃料剩余量 public void changeSpeed(double kmPerHou

16、r) /改变速度 /plane类自己的方法: public Date getLastRepairDate() /. public double calculateWindResistance() /. 5.1.2 实现接口实现接口 MovableObject接口的实现接口的实现接口清华大学 郑莉JAVA语言程序设计清华大学java118l为为 MovableObjects安装遥控器安装遥控器(remote control)public class RemoteControl private MovableObject machine; RemoteControl(MovableObject m

17、) 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类类接口清华大学 郑莉JAVA语言程序设计清华大学java1195.1.3 多重继承多重继承l多重继承多重继承 Java的设计以简单实用为导向,不允许一个类

18、有多个父类 但允许一个类可以实现多个接口,通过这种机制可实现多重继承 一个类实现多个接口的语法如下类修饰符 class 类名称 implements 接口1,接口2, 接口清华大学 郑莉JAVA语言程序设计清华大学java120lCar类可以实现接口类可以实现接口Insurable,Drivable,Sellablepublic class Car implements Insurable, Drivable, Sellable . 5.1.3 多重继承多重继承 Car的例子的例子接口清华大学 郑莉JAVA语言程序设计清华大学java121l声明声明Circle类实现接口类实现接口Shape2

19、D和和Color Shape2D具有pi与area()方法,用来计算面积 Color则具有setColor方法,可用来赋值颜色 通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了多重继承的目的interface Shape2D /声明Shape2D接口 final double pi=3.14; /数据成员一定要初始化 public abstract double area(); /抽象方法interface Color void setColor(String str); /抽象方法5.1.3 多重继承多重继承 例例5_6接口清华大学 郑莉JAVA语言程序设计清华大学ja

20、va122class 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 setColor(String str) /定义setColor()的处理方式 color=str; System.out.println(color=+color); 接口5.1.3 多重继承多重继承

21、 例例5_6清华大学 郑莉JAVA语言程序设计清华大学java123l测试类测试类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(); l输出结果输出结果color=blueArea = 12.56接口5.1.3 多重继承多重继承 例例5_6运行结果运行结果清华大学 郑莉JAVA语言程序设计清华大学java1245.1.4

22、接口的扩展接口的扩展l接口的扩展接口的扩展 接口可通过扩展的技术派生出新的接口l原来的接口称为基本接口(base interface)或父接口(super interface)l派生出的接口称为派生接口(derived interface)或子接口(sub interface) 派生接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要 实现接口的类也必须实现此接口的父接口 接口扩展的语法interface 子接口的名称 extends 父接口的名称1,父接口的名称2, 接口清华大学 郑莉JAVA语言程序设计清华大学java125lShape是父接口,是父接口,Shape2D与与

23、Shape3D是其子接是其子接口。口。Circle类及类及Rectangle类实现接口类实现接口Shape2D,而而Box类及类及Sphere类实现接口类实现接口Shape3D 5.1.4 接口的扩展接口的扩展 例例5_7Shape接口接口Shape2D接口接口Shape3D接口接口Sphere类类Box类类Rectangle类类Circle类类接口清华大学 郑莉JAVA语言程序设计清华大学java126l部分代码如下部分代码如下/ 声明Shape接口interface Shape double pi=3.14; void setColor(String str); /声明Shape2D接口扩

24、展了Shape接口interface Shape2D extends Shape double area();5.1.4 接口的扩展接口的扩展 例例5_7接口清华大学 郑莉JAVA语言程序设计清华大学java127class Circle implements Shape2D double radius; String color; public Circle(double r) radius=r; public double area() return (pi*radius*radius); public void setColor(String str) color=str; System

25、.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接口清华大学 郑莉JAVA语言程序设计清华大学java128l运行结果运行结果color=blueArea = 12.56l说明说明 首先声明了父接口Shap

26、e,然后声明其子接口Shape2D 之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与area()方法的处理方式 最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法5.1.4 接口的扩展接口的扩展 例例5_7运行结果运行结果接口清华大学 郑莉JAVA语言程序设计清华大学java129lFixedInsurable 和和DepreciatingInsurable接口接口 都继承了Insurable接口 实现它们类也必须实现Insurable接口中的所有方法public inte

27、rface DepreciatingInsurable extends Insurable public double computeFairMarketValue(); public interface FixedInsurable extends Insurable public int getEvaluationPeriod();5.1.4 接口的扩展接口的扩展 Insurable接口的例子接口的例子接口清华大学 郑莉JAVA语言程序设计清华大学java1305.2 塑型塑型l塑型塑型( (type-casting)type-casting)又称为类型转换方式l隐式(自动)的类型转换l显

28、式(强制)的类型转换清华大学 郑莉JAVA语言程序设计清华大学java1315.2.1 塑型的概念塑型的概念l塑型的对象包括塑型的对象包括基本数据类型l将值从一种形式转换成另一种形式引用变量l将对象暂时当成更一般的对象来对待,并不改变其类型l只能被塑型为任何一个父类类型对象所属的类实现的一个接口被塑型为父类或接口后,再被塑型回其本身所在的类塑型清华大学 郑莉JAVA语言程序设计清华大学java132lManager对象对象 可以被塑型为Employee、Person、Object或Insurable, 不能被塑型为Customer、Company或Car ObjectPersonEmploye

29、eCustomerManagerCompanyCarInsurable5.2.1 塑型的概念塑型的概念 一个例子一个例子塑型清华大学 郑莉JAVA语言程序设计清华大学java133l基本数据类型基本数据类型 相容类型之间存储容量低的自动向存储容量高的类型转换l引用变量引用变量 被塑型成更一般的类Employee emp; emp = new Manager(); /将Manager类型的对象直接赋给 /Employee类的引用变量,系统会 /自动将Manage对象塑型为Employee类 被塑型为对象所属类实现的接口类型Car jetta = new Car(); Insurable item

30、 = jetta; 5.2.1 塑型的概念塑型的概念 隐式隐式(自动自动)的类型转换的类型转换塑型清华大学 郑莉JAVA语言程序设计清华大学java1345.2.1 塑型的概念塑型的概念 显式显式(强制强制)的类型转换的类型转换l基本数据类型基本数据类型(int)871.34354; / 结果为 871 (char)65; / 结果为A (long)453; / 结果为453Ll引用变量:还原为本来的类型引用变量:还原为本来的类型Employee emp; Manager man;emp = new Manager();man = (Manager)emp; /将emp强制塑型为本来的类型塑型

31、清华大学 郑莉JAVA语言程序设计清华大学java1355.2.2 塑型的应用塑型的应用l塑型应用的场合包括塑型应用的场合包括赋值转换l赋值号右边的表达式类型或对象转换为左边的类型方法调用转换l实参的类型转换为形参的类型算数表达式转换l算数混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换l字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串 塑型清华大学 郑莉JAVA语言程序设计清华大学java136l当一个类对象被塑型为其父类后,它提供的方法当一个类对象被塑型为其父类后,它提供的方法会减少会减少 当Manager对象被塑型为Employee之

32、后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法 将其塑型为本来的类型后,又能接收getSalary()方法了5.2.2 塑型的应用塑型的应用塑型清华大学 郑莉JAVA语言程序设计清华大学java1375.2.3 方法的查找方法的查找l如果在塑型前和塑型后的类中都提供如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪塑型后的对象,那么系统将会调用哪一个类中的方法一个类中的方法? 实例方法的查找 类方法的查找塑型清华大学 郑莉JAVA语言程序设计清华大学j

33、ava138l从对象创建时的类开始,沿类层次向上查从对象创建时的类开始,沿类层次向上查找找 Manager manManager man = new Manager(); = new Manager(); Employee emp1Employee emp1 = new Employee(); = new Employee(); Employee emp2Employee emp2 = (Employee)man; = (Employee)man; putePay(); .computePay(); / / 调用调用EmployeeEmployee类中的类中的computePay()compu

34、tePay()方法方法 putePay(); .computePay(); / / 调用调用ManagerManager类中的类中的computePay()computePay()方法方法 putePay(); .computePay(); / / 调用调用ManagerManager类中的类中的computePay()computePay()方法方法 5.2.3 方法的查找方法的查找 实例方法的查找实例方法的查找塑型清华大学 郑莉JAVA语言程序设计清华大学java139l总是在引用变量声明时所属的类中进行查总是在引用变量声明时所属的类中进行查找找 Manager manManager ma

35、n = new Manager(); = new Manager(); Employee emp1Employee emp1 = new Employee(); = new Employee(); Employee emp2Employee emp2 = (Employee)man; = (Employee)man; manman.expenseAllowance(); /in Manager .expenseAllowance(); /in Manager emp1emp1.expenseAllowance(); /in Employee .expenseAllowance(); /in E

36、mployee emp2emp2.expenseAllowance(); /in Employee! .expenseAllowance(); /in Employee! 5.2.3 方法的查找方法的查找 类方法的查找类方法的查找塑型清华大学 郑莉JAVA语言程序设计清华大学java1405.3 多态的概念多态的概念l多态多态 是指不同类型的对象可以响应相同的消息 从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的 例如l所有的Object类的对象都响应toString()方法l所有的BankA

37、ccount类的对象都响应deposit()方法清华大学 郑莉JAVA语言程序设计清华大学java1415.3.1 多态的目的多态的目的l多态的目的多态的目的 所有的对象都可被塑型为相同的类型,响应相同的消息 使代码变得简单且容易理解 使程序具有很好的“扩展性”多态的概念清华大学 郑莉JAVA语言程序设计清华大学java142l绘图绘图直接的方式直接的方式 希望能够画出任意子类型对象的形状,可以在Shape 类中声明几个绘图方法,对不同的实际对象,采用不同的画法if (aShape instanceof Circle) aShape.drawCircle(); if (aShape insta

38、nceof Triangle) aShape.drawTriangle(); if (aShape instanceof Rectangle)aShape.drawRectangle();5.3.1 多态的目的多态的目的 一个例子一个例子多态的概念清华大学 郑莉JAVA语言程序设计清华大学java143l绘图绘图更好的方式更好的方式 在每个子类中都声明同名的draw()方法 以后绘图可如下进行Shape s = new Circle(); s.draw(); lCircle属于Shape的一种,系统会执行自动塑型l当调用方法draw时,实际调用的是Circle.draw()l在程序运行时才进行绑定,接下来介绍绑定的概念5.3.1 多态的目的多态的目的 一个例子一个例子多态的概念清华大学 郑莉JAVA语言程序设计清华大学java1445.3.2 绑定的概念绑定的概念l绑定绑定 指将一个方法调用同一个方法主体连接到一起 根据绑定时期的不同,可分为l早期绑定 程序运行之前执行绑定l晚期绑定 也叫作“动态绑定”或“运行期绑定 基于对象的类别,在程序运行时执行绑定多态的概念清华大学 郑莉JAVA语言程序设计清华大学java145l仍以绘图为例,所有类都放在仍以绘图为例,所有类都放在binding包中

温馨提示

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

评论

0/150

提交评论