《java语言程序设计》第5章.ppt

上传人:本田雅阁 文档编号:2152656 上传时间:2019-02-23 格式:PPT 页数:57 大小:255.01KB
返回 下载 相关 举报
《java语言程序设计》第5章.ppt_第1页
第1页 / 共57页
《java语言程序设计》第5章.ppt_第2页
第2页 / 共57页
《java语言程序设计》第5章.ppt_第3页
第3页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《《java语言程序设计》第5章.ppt》由会员分享,可在线阅读,更多相关《《java语言程序设计》第5章.ppt(57页珍藏版)》请在三一文库上搜索。

1、第5章 接口与多态,Programming in JAVA,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和Recta

2、ngle 把计算面积的方法声明在接口里 pi值是常量,把它声明在接口的数据成员里 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,接口,6,5.1.2 实现接口,接口

3、的实现 不能使用new直接创建接口的对象。 其它类使用implements关键字实现接口,本质是实现接口的抽象方法。 语法如下 public class 类名称 implements 接口名 抽象方法头部 方法的具体实现 ,接口,7,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 Shape2

4、D int width,height; public Rectangle(int w,int h) width=w; height=h; public double area() return (width * height); ,声明Circle与Rectangle两个类实现Shape2D接口,接口,8,测试类 public class InterfaceTester public static void main(String args) Rectangle rect=new Rectangle(5,6); System.out.println(“Area of rect = “ + re

5、ct.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_4运行结果,接口,9,声明接口类型的变量,并用它来访问对象 public class VariableTester public static void main(String args) Shape2D var1,var2; var1=new Rectangle(5,6); /矩形对象自动转化为接口对

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,5.1.2 实现接口 例5_5,接口,10,5.1.3 接口的作用,接口的作用 封装相关或不相关类之间的共同属性和方法。 实现多继承。,接口,11,保险公司的例子(不相关类) 具有车辆保险、人员保险、公司保险等多种保险业务,

7、在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable 接口 在UML图中,实现接口用带有空三角形的虚线表示,5.1.3 接口的作用 例5_1,接口,12,5.1.3 接口的作用-多重继承,多重继承 一个类只能有一个父类,但允许一个类可以实现多个接口,通过这种机制可实现多重继承。 一个类实现多个接口的语法如下 类修饰符 class 类名称 implements 接口1,接口2, ,接口,13,声明Circle类实现接口Shape2D和Color Shape2D具有pi与area()方法,用来计算面积 Color则具有setColor方法,可用来赋

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

9、olor; 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 接口的作用-多重继承 例5_6,15,测试类 public class MultiInterfaceTester public static void main(S

10、tring args) 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运行结果,16,5.1.4 接口的继承(扩展),接口的继承 子接口继承父接口。 接口继承的语法,支持多重继承 interface 子接口extends 父接口1,父接口2, 实现接口的类也必须实现此接口的父接口,接口,17,Shape是父接口,Shape2D与Shape3D

11、是其子接口。Circle类及Rectangle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D,5.1.4 接口的扩展 例5_7,接口,18,部分代码如下 / 声明Shape接口 interface Shape double pi=3.14; void setColor(String str); /声明Shape2D接口扩展了Shape接口 interface Shape2D extends Shape double area(); ,5.1.4 接口的扩展 例5_7,接口,19,class Circle implements Shape2D double radiu

12、s; String color; public Circle(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.setCol

13、or(“blue“); System.out.println(“Area = “ + cir.area(); ,5.1.4 接口的扩展 例5_7,接口,20,运行结果 color=blue Area = 12.56 说明 首先声明了父接口Shape,然后声明其子接口Shape2D 之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与area()方法的处理方式 最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法,5.1.4 接口的扩展 例5_7运行结果,接口,21,5.2 塑型,

14、塑型(type-casting) 又称为类型转换 方式 隐式(自动)的类型转换 显式(强制)的类型转换,22,5.2.1 塑型的概念,塑型的对象包括 基本数据类型 将值从一种形式转换成另一种形式 对象 只能被塑型为 父类类型 对象所属的类实现的接口 被塑型为父类或接口后,再被塑型回其本身,塑型,23,Manager对象 可以被塑型为Employee、Person、Object或Insurable, 不能被塑型为Customer、Company或Car,5.2.1 塑型的概念 一个例子,塑型,24,基本数据类型 相容类型之间存储容量低的自动向存储容量高的类型转换 对象 被塑型成父类 Employ

15、ee emp; emp = new Manager(); /将Manage对象塑型为Employee对象 被塑型为所实现的接口类型 Car jetta = new Car(); Insurable item = jetta;,5.2.1 塑型的概念 隐式(自动)的类型转换,塑型,25,5.2.1 塑型的概念 显式(强制)的类型转换,基本数据类型 (int)871.34354; / 结果为 871 (char)65; / 结果为A (long)453; / 结果为453L 对象(还原功能) Employee emp; Manager man; emp = new Manager(); man =

16、 (Manager)emp; /将emp强制塑型为本来的类型,塑型,26,5.2.2 塑型的应用,塑型应用的场合包括 赋值转换 赋值号右边的表达式类型或对象转换为左边的类型 方法调用转换 实参的类型转换为形参的类型 算数表达式转换 算数混合运算时,不同类型的项转换为相同的类型再进行运算 字符串转换 字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串,塑型,27,当一个类对象被塑型为其父类后,它提供的方法会减少 当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSala

17、ry()方法 将其塑型为本来的类型后,又能接收getSalary()方法了,5.2.2 塑型的应用,塑型,28,5.2.3 方法的查找,如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法? 实例方法的查找 类方法的查找,塑型,29,从对象创建时的类开始,沿类层次向上查找,Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; putePay(); / 调用Employee类中的computePay()方法 p

18、utePay(); / 调用Manager类中的computePay()方法 putePay(); / 调用Manager类中的computePay()方法,5.2.3 方法的查找 实例方法的查找,塑型,30,总是在引用变量声明时所属的类中进行查找,Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; man.expenseAllowance(); /in Manager emp1.expenseAllowance(); /in Employee emp2.expe

19、nseAllowance(); /in Employee!,5.2.3 方法的查找 类方法的查找,塑型,31,5.3 多态的概念,多态(相同的方法,不同的实现)。 一个类中方法的重载。 (例如:一个类中多个构造方法。) 多个子类对父类方法重写(draw). 执行时,子类对象c向上塑性为父类的对象f。父类对象调用重写方法即f.draw,实际上调用的是子类的重写方法,相当于c.draw.,32,5.3 多态的概念 一个例子,多态的概念,Shape s = new Circle(); /圆向上塑性为图形 s.draw(); /调用圆的画法 s=new Square();/正方形向上塑性为图形 s.d

20、raw(); /调用正方形的画法,33,5.3.1多态的实现技术 -动态绑定,动态绑定 运行时,将方法的调用同定义该方法的类连接到一起。 Shape s = new Circle(); /圆向上塑性为图形 s.draw(); /调用圆的画法 s=new Square();/正方形向上塑性为图形 s.draw(); /调用正方形的画法 编译时,无法确定draw方法与谁绑定,运行好,通过new 创建对象,实现动态绑定。,多态的概念,34,仍以绘图为例,所有类都放在binding包中 基类Shape建立了一个通用接口 class Shape void draw() void erase() 派生类覆

21、盖了draw方法,为每种特殊的几何形状都提供独一无二的行为 class Circle extends Shape void draw() System.out.println(“Circle.draw()“); void erase() System.out.println(“Circle.erase()“); ,5.3.2 动态绑定 例5_8,多态的概念,35,class Square extends Shape void draw() System.out.println(“Square.draw()“); void erase() System.out.println(“Square.e

22、rase()“); class Triangle extends Shape void draw() System.out.println(“Triangle.draw()“); void erase() System.out.println(“Triangle.erase()“); ,5.3.2 动态绑定 例5_8,多态的概念,36,对动态绑定进行测试如下 public class BindingTester public static void main(String args) Shape s = new Shape(); int n; n = (int)(Math.random() *

23、 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,多态的概念,37,运行结果 Square.draw() 说明 编译时无法知道s数组元素的具体类型,运行时才能确定类型,所以是动态绑定 在主方法的循环体中,每次随机生成指向一个Circle、Square或者Triangle的引用,5.3.2 动态绑定 例5_8运行结果,多态的概念,38,5.4 多态的应用,多态的应用 技术基础

24、向上塑型技术:一个父类的引用变量可以指向不同的子类对象 动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性,多态的概念,39,声明一个抽象类Driver及两个子类FemaleDriver及MaleDriver 在Diver类中声明了抽象方法drives,在两个子类中对这个方法进行了重写 public abstract class Driver public Driver( ) public abstract void drives( ); ,5.4 多态的应用(续) 例5_9,多态的概念,40,public class FemaleDriver exten

25、ds Driver public FemaleDriver( ) public void drives( ) System.out.println(“A Female driver drives a vehicle.“); public class MaleDriver extends Driver public MaleDriver( ) public void drives( ) System.out.println(“A male driver drives a vehicle.“); ,5.4 多态的应用(续) 例5_9,多态的概念,41,public class Test1 stat

26、ic 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.,5.4 多态的应用(续) 例5_9,多态的概念,42,所有类都放在drive包中 试想有不同种类的交通工具(vehicle),如公共汽车(bus)及小汽车(car),由此可以声明一个抽象类Vehicle及两个子类Bu

27、s及Car 对前面的drives方法进行改进,使其接收一个Vehicle类的参数,当不同类型的交通工具被传送到此方法时,可以输出具体的交通工具,5.4 多态的应用(续) 例5_9改进,多态的概念,43,测试代码可改写如下: public class DriverTest static public void main(String args) Driver a = new FemaleDriver( ); Driver b = new MaleDriver( ); Vehicle x = new Car( ); Vehicle y = new Bus( ); a.drives(x); b.dr

28、ives(y); 并希望输出下面的结果 A female driver drives a Car. A male driver drives a bus.,5.4 多态的应用(续) 例5_9改进,多态的概念,44,Vehicle及其子类声明如下 public abstract class Vehicle private String type; public Vehicle( ) public Vehicle(String s) type = s; public abstract void drivedByFemaleDriver(); public abstract void drivedB

29、yMaleDriver(); ,5.4 多态的应用(续) 例5_9改进,多态的概念,45,public class Bus extends Vehicle public Bus( ) public void drivedByFemaleDriver() System.out.println(“A female driver drives a bus.“); public void drivedByMaleDriver() System.out.println(“A male driver drives a bus.“); public class Car extends Vehicle pub

30、lic 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改进,多态的概念,46,对FemaleDriver及MaleDriver类中的drives方法进行改进,在drives方法的定义体中不直接输出结果,而是调用Bus及Car类中的相应方法 public

31、 abstract class Driver public Driver() public abstract void drives(Vehicle v ); public class FemaleDriver extends Driver public FemaleDriver( ) public void drives(Vehicle v) v.drivedByFemaleDriver(); public class MaleDriver extends Driver public MaleDriver( ) public void drives(Vehicle v) v.drivedBy

32、MaleDriver(); ,5.4 多态的应用(续) 例5_9改进,多态的概念,47,运行结果 A Female driver drives a car. A male driver drives a bus. 说明 这种技术称为二次分发(“double dispatching”),即对输出消息的请求被分发两次 首先根据驾驶员的类型被发送给一个类 之后根据交通工具的类型被发送给另一个类,5.4 多态的应用(续) 例5_9改进运行结果,多态的概念,48,5.5 构造方法与多态,构造方法与多态 构造方法并不具有多态性,但仍然非常有必要理解构造方法如何在复杂的分级结构中随同多态性一同使用的情况,4

33、9,构造方法的执行顺序 执行基类的构造方法,基类成员变量初始化。 执行派生构造方法,派生类成员变量初始化。,5.5.1 构造方法的执行顺序,构造方法与多态,50,构建一个点类Point,一个球类Ball,一个运动的球类MovingBall继承自Ball public class Point private double x; private double y; public Point ( ) public Point(double x1, double y1) x = x1; y = y1; public String toString( ) return “x轴坐标为”+x+”y轴坐标为”

34、+y; ,5.5.1 构造方法的执行顺序(续) 例5_10,构造方法与多态,51,public 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, St

35、ring c) this(x1, y1, r); / 调用三个参数的构造方法 colour = c; public String toString( ) return “球中心点”+center.toString()+”,半径为”+r+”,颜色 为”+colour; ,5.5.1 构造方法的执行顺序(续) 例5_10,构造方法与多态,52,public class MovingBall extends Ball private double speed; public MovingBall( ) public MovingBall(double x1, double y1, double r,

36、 String c, double s) super(x1, y1, r, c); speed = s; public String toString( ) return super.toString( ) + “, 速度 “ +speed); ,5.5.1 构造方法的执行顺序(续) 例5_10,构造方法与多态,53,public class Tester public static void main(String args) MovingBall mb = new MovingBall(10,20,40,“green“,25); System.out.println(mb); 运行结果 球

37、中心点x轴坐标为10,y轴坐标为20, 半径为 40.0, 颜色为green,速度为25.0,5.5.1 构造方法的执行顺序(续) 例5_10运行结果,构造方法与多态,54,构造方法中的多态方法 在父类构造方法内调用重写的方法(子类动态绑定的方法)。 这种情况要避免出现。,构造方法与多态,5.5.2 构造方法中的多态方法,55,构造方法与多态,在Shap2D中声明一个抽象方法,并在构造方法内部调用之 abstract class Shap2D abstract void draw(); Shap2D() System.out.println(“Shap2D的构造方法执行“); draw();

38、System.out.println(“ Shap2D的构造方法结束“); ,5.5.2 构造方法中的多态方法(续) 例5_12,56,class Circle extends Shap2D int radius = 1; Circle(int r) radius = r; System.out.println(“Circle的构造方法, 半径 = “ + radius); void draw() System.out.println(“Circle的draw方法, 半径 = “ + radius); public class PolyConstructors public static void main(String args) new Circle(5); ,5.5.2 构造方法中的多态方法(续) 例5_12,构造方法与多态,57,运行结果 Shap2D的构造方法执行 Circle的draw方法, 半径 =0 Shap2D的构造方法结束 Circle的构造方法, 半径 =5,构造方法与多态,5.5.2 构造方法中的多态方法(续) 例5_12运行结果,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1