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

下载本文档

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

文档简介

1、java语言程序设计第5章 第第5章章 接口与多态接口与多态 Programming in JAVA 07信管JAVA语言程序设计 java语言程序设计第5章2 目录目录 l5.1 接口接口 l5.2 塑型塑型 l5.3 多态的概念多态的概念 l5.4 多态的应用多态的应用 l5.5 构造方法与多态构造方法与多态 l5.6 内部类内部类 l5.7 本章小结本章小结 07信管JAVA语言程序设计 java语言程序设计第5章3 5.1 接口接口 l接口接口 与抽象类一样定义多个类的共同属性与方法. 接口中的方法都是抽象方法,仅给出方法的声 明,不给出具体实现。具体实现由其实现类(对 于抽象类来说是

2、子类)来完成。 接口中的属性必须为常量,前面为final修饰符 07信管JAVA语言程序设计 java语言程序设计第5章4 l接口的语法接口的语法 声明格式为 interface 接口名称 /属性常量 /抽象方法 5.1.1 接口的声明接口的声明 接口 07信管JAVA语言程序设计 java语言程序设计第5章5 l声明一个接口声明一个接口Shape2D,实现类为实现类为Circle 和和Rectangle 把计算面积的方法声明在接口里 pi值是常量,把它声明在接口的数据成员里 interface Shape2D /声明Shape2D接口 final double pi=3.14; /数据成员一

3、定要初始化 public abstract double area();/抽象方法 在接口的声明中,允许省略一些关键字,也可 声明如下(,省略抽象) interface Shape2D double pi=3.14; /省略常量的final修饰 double area(); /省略抽象方法的public abstract修饰 5.1.1 接口的声明接口的声明 例例5_2 接口 07信管JAVA语言程序设计 java语言程序设计第5章6 5.1.2 实现接口实现接口 l接口的实现接口的实现 不能使用new直接创建接口的对象。 其它类使用implements关键字实现接口, 本质是实现接口的抽象方

4、法。 语法如下 public class 类名称 implements 接口名 抽象方法头部 方法的具体实现 接口 07信管JAVA语言程序设计 java语言程序设计第5章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 Shape2D int width,height; publi

5、c Rectangle(int w,int h) width=w; height=h; public double area() return (width * height); l声明声明Circle与与Rectangle两个类实现两个类实现Shape2D接口接口 接口 07信管JAVA语言程序设计 java语言程序设计第5章8 l测试类测试类 public class InterfaceTester public static void main(String args) Rectangle rect=new Rectangle(5,6); System.out.println(Area

6、of rect = + rect.area(); Circle cir=new Circle(2.0); System.out.println(Area of cir = + cir.area(); l运行结果运行结果 Area of rect = 30.0 Area of cir = 12.56 5.1.2 实现接口实现接口 例例5_4运行结果运行结果 接口 07信管JAVA语言程序设计 java语言程序设计第5章9 l声明接口类型的变量,并用它来访问对象声明接口类型的变量,并用它来访问对象 public class VariableTester public static void mai

7、n(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(); l输出结果输出结果 Area of var1 = 30.0 Area of var2 = 12.56 5.1.2 实现接口实现接口 例例5_5 接口 07信管JAVA语言程序设计 jav

8、a语言程序设计第5章10 5.1.3 接口的作用接口的作用 l接口的作用接口的作用 封装相关或不相关类之间的共同属性和 方法。 实现多继承。 接口 07信管JAVA语言程序设计 java语言程序设计第5章11 l保险公司的例子(不相关类)保险公司的例子(不相关类) 具有车辆保险、人员保险、公司保险等多种保险业务, 在对外提供服务方面具有相似性,如都需要计算保险费 (premium)等,因此可声明一个Insurable 接口 在UML图中,实现接口用带有空三角形的虚线表示 5.1.3 接口的作用接口的作用 例例5_1 Insurable CompanyPersonCar 接口 07信管JAVA语

9、言程序设计 java语言程序设计第5章12 5.1.3 接口的作用接口的作用-多重继承多重继承 l多重继承多重继承 一个类只能有一个父类,但允许一个类可以实现 多个接口,通过这种机制可实现多重继承。 一个类实现多个接口的语法如下 类修饰符 class 类名称 implements 接口1,接口2, 接口 07信管JAVA语言程序设计 java语言程序设计第5章13 l声明声明Circle类实现接口类实现接口Shape2D和和Color Shape2D具有pi与area()方法,用来计算面积 Color则具有setColor方法,可用来赋值颜色 通过实现这两个接口,Circle类得以同时拥有这

10、两个接口的成员,达到了多重继承的目的 interface Shape2D /声明Shape2D接口 final double pi=3.14; /数据成员一定要初始化 public abstract double area(); /抽象方法 interface Color void setColor(String str); /抽象方法 5.1.3 接口的作用接口的作用-多重继承多重继承 例例5_6 接口 07信管JAVA语言程序设计 java语言程序设计第5章14 class Circle implements Shape2D,Color / 实现Circle类 double radius;

11、 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 接口的作用接口的作用-多重继承多重继承 例例5_6 07信管JAVA语言程序设计 java语言程序设计第5章15 l测试类测试类 public clas

12、s 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=blue Area = 12.56 接口 5.1.3 接口的作用接口的作用-多重继承多重继承 例例5_6运行结果运行结果 07信管JAVA语言程序设计 java语言程序设计第5章16 5.1.4 接口的继承(扩展)接口的继承(扩展) l接口的继承接口的继承 子接

13、口继承父接口。 接口继承的语法,支持多重继承 interface 子接口extends 父接口1,父接口2, 实现接口的类也必须实现此接口的父接口 接口 07信管JAVA语言程序设计 java语言程序设计第5章17 lShape是父接口,是父接口,Shape2D与与Shape3D是其子接是其子接 口。口。Circle类及类及Rectangle类实现接口类实现接口Shape2D, 而而Box类及类及Sphere类实现接口类实现接口Shape3D 5.1.4 接口的扩展接口的扩展 例例5_7 Shape接口接口 Shape2D接口接口Shape3D接口接口 Sphere类类Box类类Rectang

14、le类类Circle类类 接口 07信管JAVA语言程序设计 java语言程序设计第5章18 l部分代码如下部分代码如下 / 声明Shape接口 interface Shape double pi=3.14; void setColor(String str); /声明Shape2D接口扩展了Shape接口 interface Shape2D extends Shape double area(); 5.1.4 接口的扩展接口的扩展 例例5_7 接口 07信管JAVA语言程序设计 java语言程序设计第5章19 class Circle implements Shape2D double ra

15、dius; 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.setCo

16、lor(blue); System.out.println(Area = + cir.area(); 5.1.4 接口的扩展接口的扩展 例例5_7 接口 07信管JAVA语言程序设计 java语言程序设计第5章20 l运行结果运行结果 color=blue Area = 12.56 l说明说明 首先声明了父接口Shape,然后声明其子接口 Shape2D 之后声明类Circle实现Shape2D子接口,因而 在此类内必须明确定义setColor()与area()方法 的处理方式 最后在主类中我们声明了Circle类型的变量cir并 创建新的对象,最后通过cir对象调用setColor() 与a

17、rea()方法 5.1.4 接口的扩展接口的扩展 例例5_7运行结果运行结果 接口 07信管JAVA语言程序设计 java语言程序设计第5章21 5.2 塑型塑型 l塑型塑型( (type-casting)type-casting) 又称为类型转换 方式 l隐式(自动)的类型转换 l显式(强制)的类型转换 07信管JAVA语言程序设计 java语言程序设计第5章22 5.2.1 塑型的概念塑型的概念 l塑型的对象包括塑型的对象包括 基本数据类型 l将值从一种形式转换成另一种形式 对象 l只能被塑型为 父类类型 对象所属的类实现的接口 被塑型为父类或接口后,再被塑型回其本身 塑型 07信管JAV

18、A语言程序设计 java语言程序设计第5章23 lManager对象对象 可以被塑型为Employee、Person、Object或Insurable, 不能被塑型为Customer、Company或Car Object Person EmployeeCustomer Manager CompanyCar Insurable 5.2.1 塑型的概念塑型的概念 一个例子一个例子 塑型 07信管JAVA语言程序设计 java语言程序设计第5章24 l基本数据类型基本数据类型 相容类型之间存储容量低的自动向存储容量高的 类型转换 l对象对象 被塑型成父类 Employee emp; emp = ne

19、w Manager(); /将Manage对象塑型为Employee对象 被塑型为所实现的接口类型 Car jetta = new Car(); Insurable item = jetta; 5.2.1 塑型的概念塑型的概念 隐式隐式(自动自动)的类型转换的类型转换 塑型 07信管JAVA语言程序设计 java语言程序设计第5章25 5.2.1 塑型的概念塑型的概念 显式显式(强制强制)的类型转换的类型转换 l基本数据类型基本数据类型 (int)871.34354; / 结果为 871 (char)65; / 结果为A (long)453; / 结果为453L l对象对象(还原功能还原功能)

20、 Employee emp; Manager man; emp = new Manager(); man = (Manager)emp; /将emp强制塑型为本来 的类型 塑型 07信管JAVA语言程序设计 java语言程序设计第5章26 5.2.2 塑型的应用塑型的应用 l塑型应用的场合包括塑型应用的场合包括 赋值转换 l赋值号右边的表达式类型或对象转换为左边的类型 方法调用转换 l实参的类型转换为形参的类型 算数表达式转换 l算数混合运算时,不同类型的项转换为相同的类型再进 行运算 字符串转换 l字符串连接运算时,如果一个操作数为字符串,一个操 作数为数值型,则会自动将数值型转换为字符串

21、塑型 07信管JAVA语言程序设计 java语言程序设计第5章27 l当一个类对象被塑型为其父类后,它提供的方法当一个类对象被塑型为其父类后,它提供的方法 会减少会减少 当Manager对象被塑型为Employee之后,它只能接收 getName()及getEmployeeNumber()方法,不能接收 getSalary()方法 将其塑型为本来的类型后,又能接收getSalary()方法了 5.2.2 塑型的应用塑型的应用 塑型 07信管JAVA语言程序设计 java语言程序设计第5章28 5.2.3 方法的查找方法的查找 l如果在塑型前和塑型后的类中都提供如果在塑型前和塑型后的类中都提供

22、了相同的方法,如果将此方法发送给了相同的方法,如果将此方法发送给 塑型后的对象,那么系统将会调用哪塑型后的对象,那么系统将会调用哪 一个类中的方法一个类中的方法? 实例方法的查找 类方法的查找 塑型 07信管JAVA语言程序设计 java语言程序设计第5章29 l从对象创建时的类开始,沿类层次向上查从对象创建时的类开始,沿类层次向上查 找找 Manager man = new Manager(); Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp1 = new Employee(); Employ

23、ee emp2 = (Employee)man; Employee emp2 = (Employee)man; putePay(); / putePay(); / 调用调用EmployeeEmployee类中的类中的computePay()computePay()方法方法 putePay(); / putePay(); / 调用调用ManagerManager类中的类中的computePay()computePay()方法方法 putePay(); / putePay(); / 调用调用ManagerManager类中的类中的computePay()computePay()方法方法 5.2.3

24、 方法的查找方法的查找 实例方法的查找实例方法的查找 塑型 07信管JAVA语言程序设计 java语言程序设计第5章30 l总是在引用变量声明时所属的类中进行查总是在引用变量声明时所属的类中进行查 找找 Manager man = new Manager(); Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; Employee emp2 = (Employee)man; man.expenseAll

25、owance(); /in Manager man.expenseAllowance(); /in Manager emp1.expenseAllowance(); /in Employee emp1.expenseAllowance(); /in Employee emp2.expenseAllowance(); /in Employee! emp2.expenseAllowance(); /in Employee! 5.2.3 方法的查找方法的查找 类方法的查找类方法的查找 塑型 07信管JAVA语言程序设计 java语言程序设计第5章31 5.3 多态的概念多态的概念 l多态(相同的方法

26、,不同的实现)。多态(相同的方法,不同的实现)。 一个类中方法的重载。 (例如:一个类中多个构造方法。) 多个子类对父类方法重写(draw). 执行时,子类对象c向上塑性为父类的对象f。父类对 象调用重写方法即f.draw,实际上调用的是子类的重 写方法,相当于c.draw. 07信管JAVA语言程序设计 java语言程序设计第5章32 5.3 多态的概念多态的概念 一个例子一个例子 多态的概念 Shape s = new Circle(); /圆向上塑性为图形 s.draw(); /调用圆的画法 s=new Square();/正方形向上塑性为图形 s.draw(); /调用正方形的画法 0

27、7信管JAVA语言程序设计 java语言程序设计第5章33 5.3.1多态的实现技术多态的实现技术 -动态绑定动态绑定 l动态绑定动态绑定 运行时,将方法的调用同定义该方法的类连接 到一起。 Shape s = new Circle(); /圆向上塑性为图形 s.draw(); /调用圆的画法 s=new Square();/正方形向上塑性为图形 s.draw(); /调用正方形的画法 编译时,无法确定draw方法与谁绑定,运行好,通过new 创建对象,实现动态绑定。 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章34 l仍以绘图为例,所有类都放在仍以绘图为例,所有类都放

28、在binding包中包中 基类Shape建立了一个通用接口 class Shape void draw() void erase() 派生类覆盖了draw方法,为每种特殊的几何形 状都提供独一无二的行为 class Circle extends Shape void draw() System.out.println(Circle.draw(); void erase() System.out.println(Circle.erase(); 5.3.2 动态绑定动态绑定 例例5_8 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章35 class Square extend

29、s 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.2 动态绑定动态绑定 例例5_8 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章36 l对动态绑定进行测试如下对

30、动态绑定进行测试如下 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 多态的概念 07信管JAVA语言程序设计 java语言程序设

31、计第5章37 l运行结果运行结果 Square.draw() l说明说明 编译时无法知道s数组元素的具体类型,运行时才能确定 类型,所以是动态绑定 在主方法的循环体中,每次随机生成指向一个Circle、 Square或者Triangle的引用 5.3.2 动态绑定动态绑定 例例5_8运行结果运行结果 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章38 5.4 多态的应用多态的应用 l多态的应用多态的应用 技术基础 l向上塑型技术:一个父类的引用变量可以指 向不同的子类对象 l动态绑定技术:运行时根据父类引用变量所 指对象的实际类型执行相应的子类方法,从 而实现多态性 多态

32、的概念 07信管JAVA语言程序设计 java语言程序设计第5章39 l声明一个抽象类声明一个抽象类Driver及两个子类及两个子类 FemaleDriver及及MaleDriver l在在Diver类中声明了抽象方法类中声明了抽象方法drives,在两在两 个子类中对这个方法进行了重写个子类中对这个方法进行了重写 public abstract class Driver public Driver( ) public abstract void drives( ); 5.4 多态的应用多态的应用(续续) 例例5_9 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章40 p

33、ublic 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 void drives( ) System.out.println(A male driver drives a vehicle.); 5.4 多态的应用多态的应用(续续) 例例5_9

34、多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章41 public class Test1 static public void main(String args) Driver a = new FemaleDriver( ); Driver b = new MaleDriver( ); a.drives( ); b.drives( ); l运行结果运行结果 A Female driver drives a vehicle. A male driver drives a vehicle. 5.4 多态的应用多态的应用(续续) 例例5_9 多态的概念 07信管JAVA语言程序

35、设计 java语言程序设计第5章42 l所有类都放在所有类都放在drive包中包中 试想有不同种类的交通工具(vehicle),如公共 汽车(bus)及小汽车(car),由此可以声明一个抽 象类Vehicle及两个子类Bus及Car 对前面的drives方法进行改进,使其接收一个 Vehicle类的参数,当不同类型的交通工具被传 送到此方法时,可以输出具体的交通工具 5.4 多态的应用多态的应用(续续) 例例5_9改进改进 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章43 l测试代码可改写如下:测试代码可改写如下: public class DriverTest sta

36、tic 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.drives(y); l并希望输出下面的结果并希望输出下面的结果 A female driver drives a Car. A male driver drives a bus. 5.4 多态的应用多态的应用(续续) 例例5_9改进改进 多态的概念 07信管JAVA语言程序设计

37、java语言程序设计第5章44 lVehicle及其子类声明如下及其子类声明如下 public abstract class Vehicle private String type; public Vehicle( ) public Vehicle(String s) type = s; public abstract void drivedByFemaleDriver(); public abstract void drivedByMaleDriver(); 5.4 多态的应用多态的应用(续续) 例例5_9改进改进 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章45 p

38、ublic 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 public Car( ) public void drivedByFemaleDriver() Syst

39、em.out.println(A Female driver drives a car.); public void drivedByMaleDriver() System.out.println(A Male driver drives a car.); 5.4 多态的应用多态的应用(续续) 例例5_9改进改进 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章46 l对对FemaleDriver及及MaleDriver类中的类中的drives方法进方法进 行改进,在行改进,在drives方法的定义体中不直接输出结果,方法的定义体中不直接输出结果, 而是调用而是调用Bus及

40、及Car类中的相应方法类中的相应方法 public 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 dri

41、ves(Vehicle v) v.drivedByMaleDriver(); 5.4 多态的应用多态的应用(续续) 例例5_9改进改进 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章47 l运行结果运行结果 A Female driver drives a car. A male driver drives a bus. l说明说明 这种技术称为二次分发(“double dispatching”), 即对输出消息的请求被分发两次 l首先根据驾驶员的类型被发送给一个类 l之后根据交通工具的类型被发送给另一个类 5.4 多态的应用多态的应用(续续) 例例5_9改进运行结果改进

42、运行结果 多态的概念 07信管JAVA语言程序设计 java语言程序设计第5章48 5.5 构造方法与多态构造方法与多态 l构造方法与多态构造方法与多态 构造方法并不具有多态性,但仍然非常 有必要理解构造方法如何在复杂的分级 结构中随同多态性一同使用的情况 07信管JAVA语言程序设计 java语言程序设计第5章49 l构造方法的执行顺序构造方法的执行顺序 执行基类的构造方法,基类成员变量初始化。 执行派生构造方法,派生类成员变量初始化。 5.5.1 构造方法的执行顺序构造方法的执行顺序 构造方法与多态 07信管JAVA语言程序设计 java语言程序设计第5章50 l构建一个点类构建一个点类P

43、oint,一个球类一个球类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轴坐标为”+y; 5.5.1 构造方法的执行顺序构造方法的执行顺序(续续) 例例5_10 构造方法与多态 07信管JAVA语言程序设计 java语言程序设计

44、第5章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, String c) this(x1, y1, r); / 调用三个参数的构造方法 colour = c; publ

温馨提示

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

评论

0/150

提交评论