java语言程序设计-第5章_第1页
java语言程序设计-第5章_第2页
java语言程序设计-第5章_第3页
java语言程序设计-第5章_第4页
java语言程序设计-第5章_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 接口与多态Programming in JAVA1目录5.1 接口5.2 塑型5.3 多态的概念5.4 多态的应用5.5 构造方法与多态5.6 内部类5.7 本章小结25.1 接口接口与抽象类一样定义多个类的共同属性与方法.接口中的方法都是抽象方法,仅给出方法的声明,不给出具体实现。具体实现由其实现类(对于抽象类来说是子类)来完成。接口中的属性必须为常量,前面为final修饰符3接口的语法声明格式为interface 接口名称 /属性常量/抽象方法5.1.1 接口的声明接口4声明一个接口Shape2D,实现类为Circle和Rectangle把计算面积的方法声明在接口里pi值是常量,把

2、它声明在接口的数据成员里interface Shape2D /声明Shape2D接口 final double pi=3.14; /数据成员一定要初始化 public abstract double area();/抽象方法在接口的声明中,允许省略一些关键字,也可声明如下(,省略抽象)interface Shape2D double pi=3.14; /省略常量的final修饰 double area(); /省略抽象方法的public abstract修饰 5.1.1 接口的声明例5_2接口55.1.2 实现接口接口的实现不能使用new直接创建接口的对象。其它类使用implements关键字

3、实现接口,本质是实现接口的抽象方法。语法如下public class 类名称 implements 接口名 抽象方法头部 方法的具体实现 接口65.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

4、h) width=w; height=h; public double area() return (width * height); 声明Circle与Rectangle两个类实现Shape2D接口接口7测试类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.print

5、ln(Area of cir = + cir.area(); 运行结果Area of rect = 30.0Area of cir = 12.565.1.2 实现接口 例5_4运行结果接口8声明接口类型的变量,并用它来访问对象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

6、.0);/圆对象自动转化为接口对象System.out.println(Area of var2 = + var2.area();输出结果Area of var1 = 30.0Area of var2 = 12.565.1.2 实现接口 例5_5接口95.1.3 接口的作用接口的作用封装相关或不相关类之间的共同属性和方法。实现多继承。接口10保险公司的例子(不相关类)具有车辆保险、人员保险、公司保险等多种保险业务,在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable 接口在UML图中,实现接口用带有空三角形的虚线表示5.1.3 接口的作用例5_

7、1InsurableCompanyPersonCar接口115.1.3 接口的作用-多重继承多重继承一个类只能有一个父类,但允许一个类可以实现多个接口,通过这种机制可实现多重继承。一个类实现多个接口的语法如下类修饰符 class 类名称 implements 接口1,接口2, 接口12声明Circle类实现接口Shape2D和ColorShape2D具有pi与area()方法,用来计算面积Color则具有setColor方法,可用来赋值颜色通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了多重继承的目的interface Shape2D /声明Shape2D接口 final

8、 double pi=3.14; /数据成员一定要初始化 public abstract double area(); /抽象方法interface Color void setColor(String str); /抽象方法5.1.3 接口的作用-多重继承 例5_6接口13class Circle implements Shape2D,Color / 实现Circle类 double radius; String color; public Circle(double r) /构造方法 radius=r; public double area() /定义area()的处理方式 return

9、(pi*radius*radius); public void setColor(String str) /定义setColor()的处理方式 color=str; System.out.println(color=+color); 接口5.1.3 接口的作用-多重继承 例5_614测试类public class MultiInterfaceTester public static void main(String args) Circle cir; cir=new Circle(2.0); cir.setColor(blue); System.out.println(Area = + cir

10、.area(); 输出结果color=blueArea = 12.56接口5.1.3 接口的作用-多重继承例5_6运行结果155.1.4 接口的继承(扩展)接口的继承子接口继承父接口。接口继承的语法,支持多重继承interface 子接口extends 父接口1,父接口2, 实现接口的类也必须实现此接口的父接口接口16Shape是父接口,Shape2D与Shape3D是其子接口。Circle类及Rectangle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D 5.1.4 接口的扩展 例5_7Shape接口Shape2D接口Shape3D接口Sphere类Box类Re

11、ctangle类Circle类接口17部分代码如下/ 声明Shape接口interface Shape double pi=3.14; void setColor(String str); /声明Shape2D接口扩展了Shape接口interface Shape2D extends Shape double area();5.1.4 接口的扩展 例5_7接口18class Circle implements Shape2D double radius; String color; public Circle(double r) radius=r; public double area() r

12、eturn (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接口19运行结果c

13、olor=blueArea = 12.56说明首先声明了父接口Shape,然后声明其子接口Shape2D之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与area()方法的处理方式最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法5.1.4 接口的扩展 例5_7运行结果接口205.2 塑型塑型(type-casting)又称为类型转换方式隐式(自动)的类型转换显式(强制)的类型转换215.2.1 塑型的概念塑型的对象包括基本数据类型将值从一种形式转换成另一种形式对象只能被塑型

14、为父类类型对象所属的类实现的接口被塑型为父类或接口后,再被塑型回其本身塑型22Manager对象可以被塑型为Employee、Person、Object或Insurable,不能被塑型为Customer、Company或Car ObjectPersonEmployeeCustomerManagerCompanyCarInsurable5.2.1 塑型的概念 一个例子塑型23基本数据类型相容类型之间存储容量低的自动向存储容量高的类型转换对象被塑型成父类Employee emp; emp = new Manager(); /将Manage对象塑型为Employee对象被塑型为所实现的接口类型Car

15、 jetta = new Car(); Insurable item = jetta; 5.2.1 塑型的概念 隐式(自动)的类型转换塑型245.2.1 塑型的概念 显式(强制)的类型转换基本数据类型(int)871.34354; / 结果为 871 (char)65; / 结果为A (long)453; / 结果为453L对象(还原功能)Employee emp; Manager man;emp = new Manager();man = (Manager)emp; /将emp强制塑型为本来的类型塑型255.2.2 塑型的应用塑型应用的场合包括赋值转换赋值号右边的表达式类型或对象转换为左边的

16、类型方法调用转换实参的类型转换为形参的类型算数表达式转换算数混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串 塑型26当一个类对象被塑型为其父类后,它提供的方法会减少当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法将其塑型为本来的类型后,又能接收getSalary()方法了5.2.2 塑型的应用塑型275.2.3 方法的查找如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送

17、给塑型后的对象,那么系统将会调用哪一个类中的方法?实例方法的查找类方法的查找塑型28从对象创建时的类开始,沿类层次向上查找 Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; emp1putePay(); / 调用Employee类中的computePay()方法 manputePay(); / 调用Manager类中的computePay()方法 emp2putePay(); / 调用Manager类中的computePay()方法 5.2.3 方法的查找 实例

18、方法的查找塑型29总是在引用变量声明时所属的类中进行查找 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 方法的查找 类方法的查找塑型305.3 多态的概念多态(相同的方法,不同的实现)。一个类中方法的重载。 (例如:一个类中

19、多个构造方法。)多个子类对父类方法重写(draw). 执行时,子类对象c向上塑性为父类的对象f。父类对象调用重写方法即f.draw,实际上调用的是子类的重写方法,相当于c.draw.315.3 多态的概念 一个例子多态的概念Shape s = new Circle(); /圆向上塑性为图形s.draw(); /调用圆的画法s=new Square();/正方形向上塑性为图形s.draw(); /调用正方形的画法325.3.1多态的实现技术 -动态绑定动态绑定运行时,将方法的调用同定义该方法的类连接到一起。Shape s = new Circle(); /圆向上塑性为图形s.draw(); /调

20、用圆的画法s=new Square();/正方形向上塑性为图形s.draw(); /调用正方形的画法编译时,无法确定draw方法与谁绑定,运行好,通过new 创建对象,实现动态绑定。多态的概念33仍以绘图为例,所有类都放在binding包中基类Shape建立了一个通用接口class Shape void draw() void erase() 派生类覆盖了draw方法,为每种特殊的几何形状都提供独一无二的行为class Circle extends Shape void draw() System.out.println(Circle.draw(); void erase() System.o

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

22、.2 动态绑定 例5_8多态的概念35对动态绑定进行测试如下public class BindingTester public static void main(String args) Shape s = new Shape(); int n; n = (int)(Math.random() * 3); switch(n) case 0: s = new Circle(); break; case 1: s = new Square(); break; case 2: s = new Triangle(); s.draw(); 5.3.2 动态绑定 例5_8多态的概念36运行结果Square

23、.draw()说明编译时无法知道s数组元素的具体类型,运行时才能确定类型,所以是动态绑定在主方法的循环体中,每次随机生成指向一个Circle、Square或者Triangle的引用5.3.2 动态绑定 例5_8运行结果多态的概念375.4 多态的应用 多态的应用技术基础向上塑型技术:一个父类的引用变量可以指向不同的子类对象动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性多态的概念38声明一个抽象类Driver及两个子类FemaleDriver及MaleDriver在Diver类中声明了抽象方法drives,在两个子类中对这个方法进行了重写public a

24、bstract class Driverpublic Driver( ) public abstract void drives( );5.4 多态的应用(续)例5_9多态的概念39public class FemaleDriver extends Driver public FemaleDriver( ) public void drives( ) System.out.println(A Female driver drives a vehicle.); public class MaleDriver extends Driver public MaleDriver( ) public v

25、oid drives( ) System.out.println(A male driver drives a vehicle.); 5.4 多态的应用(续)例5_9多态的概念40public class Test1static public void main(String args) Driver a = new FemaleDriver( ); Driver b = new MaleDriver( ); a.drives( ); b.drives( ); 运行结果A Female driver drives a vehicle.A male driver drives a vehicle

26、.5.4 多态的应用(续)例5_9多态的概念41所有类都放在drive包中试想有不同种类的交通工具(vehicle),如公共汽车(bus)及小汽车(car),由此可以声明一个抽象类Vehicle及两个子类Bus及Car对前面的drives方法进行改进,使其接收一个Vehicle类的参数,当不同类型的交通工具被传送到此方法时,可以输出具体的交通工具5.4 多态的应用(续)例5_9改进多态的概念42测试代码可改写如下:public class DriverTest static public void main(String args) Driver a = new FemaleDriver( )

27、; Driver b = new MaleDriver( ); Vehicle x = new Car( ); Vehicle y = new Bus( ); a.drives(x); b.drives(y); 并希望输出下面的结果A female driver drives a Car.A male driver drives a bus.5.4 多态的应用(续)例5_9改进多态的概念43Vehicle及其子类声明如下public abstract class Vehicleprivate String type;public Vehicle( ) public Vehicle(String

28、 s) type = s; public abstract void drivedByFemaleDriver();public abstract void drivedByMaleDriver();5.4 多态的应用(续)例5_9改进多态的概念44public class Bus extends Vehicle public Bus( ) public void drivedByFemaleDriver() System.out.println(A female driver drives a bus.); public void drivedByMaleDriver() System.ou

29、t.println(A male driver drives a bus.); public class Car extends Vehicle public Car( ) public void drivedByFemaleDriver() System.out.println(A Female driver drives a car.); public void drivedByMaleDriver() System.out.println(A Male driver drives a car.); 5.4 多态的应用(续)例5_9改进多态的概念45对FemaleDriver及MaleDr

30、iver类中的drives方法进行改进,在drives方法的定义体中不直接输出结果,而是调用Bus及Car类中的相应方法public abstract class Driver public Driver() public abstract void drives(Vehicle v );public class FemaleDriver extends Driverpublic FemaleDriver( ) public void drives(Vehicle v) v.drivedByFemaleDriver(); public class MaleDriver extends Driv

31、erpublic MaleDriver( ) public void drives(Vehicle v) v.drivedByMaleDriver(); 5.4 多态的应用(续)例5_9改进多态的概念46运行结果A Female driver drives a car.A male driver drives a bus.说明这种技术称为二次分发(“double dispatching”),即对输出消息的请求被分发两次首先根据驾驶员的类型被发送给一个类之后根据交通工具的类型被发送给另一个类5.4 多态的应用(续) 例5_9改进运行结果多态的概念475.5 构造方法与多态构造方法与多态构造方法并

32、不具有多态性,但仍然非常有必要理解构造方法如何在复杂的分级结构中随同多态性一同使用的情况48构造方法的执行顺序执行基类的构造方法,基类成员变量初始化。执行派生构造方法,派生类成员变量初始化。5.5.1 构造方法的执行顺序构造方法与多态49构建一个点类Point,一个球类Ball,一个运动的球类MovingBall继承自Ballpublic class Point private double x;private double y;public Point ( ) public Point(double x1, double y1) x = x1; y = y1;public String to

33、String( ) return “x轴坐标为”+x+”y轴坐标为”+y;5.5.1 构造方法的执行顺序(续) 例5_10构造方法与多态50public class Ball private Point center; /中心点private double radius; /半径private String colour; /颜色public Ball( ) public Ball(double x1, double y1, double r) center = new Point(x1, y1); /调用Point中的构造方法 radius = r;public Ball(double x1, double y1, double r, String c) this(x1, y1, r); / 调用三个参数的构造方法 colour = c;public String toString( ) return “球中心点”+center.toString()+”,半径为”+r+”,颜色 为”+colour;5.5.1 构造方法的执行顺序(续) 例5_10构造方法与多态51public class MovingBall extends Ball private dou

温馨提示

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

评论

0/150

提交评论