java语言程序设计-第5章

上传人:风*** 文档编号:223050328 上传时间:2023-07-14 格式:PPT 页数:57 大小:228.52KB
收藏 版权申诉 举报 下载
java语言程序设计-第5章_第1页
第1页 / 共57页
java语言程序设计-第5章_第2页
第2页 / 共57页
java语言程序设计-第5章_第3页
第3页 / 共57页
资源描述:

《java语言程序设计-第5章》由会员分享,可在线阅读,更多相关《java语言程序设计-第5章(57页珍藏版)》请在装配图网上搜索。

1、第第5章章 接口与多态接口与多态Programming in JAVA107信管JAVA语言程序设计目录目录l5.1 接口接口l5.2 塑型塑型l5.3 多态的概念多态的概念l5.4 多态的应用多态的应用l5.5 构造方法与多态构造方法与多态l5.6 内部类内部类l5.7 本章小结本章小结207信管JAVA语言程序设计5.1 接口接口l接口接口与抽象类一样定义多个类的共同属性与方法.接口中的方法都是抽象方法,仅给出方法的声明,不给出具体实现。具体实现由其实现类(对于抽象类来说是子类)来完成。接口中的属性必须为常量,前面为final修饰符307信管JAVA语言程序设计l接口的语法接口的语法声明格

2、式为interface 接口名称/属性常量/抽象方法5.1.1 接口的声明接口的声明接口407信管JAVA语言程序设计l声明一个接口声明一个接口Shape2D,实现类为实现类为Circle和和Rectangle把计算面积的方法声明在接口里pi值是常量,把它声明在接口的数据成员里interface Shape2D /声明Shape2D接口 final double pi=3.14;/数据成员一定要初始化 public abstract double area();/抽象方法在接口的声明中,允许省略一些关键字,也可声明如下(,省略抽象)interface Shape2D double pi=3.1

3、4;/省略常量的final修饰 double area();/省略抽象方法的public abstract修饰 5.1.1 接口的声明接口的声明例例5_2接口507信管JAVA语言程序设计5.1.2 实现接口实现接口l接口的实现接口的实现不能使用new直接创建接口的对象。其它类使用implements关键字实现接口,本质是实现接口的抽象方法。语法如下public class 类名称 implements 接口名 抽象方法头部 方法的具体实现 接口607信管JAVA语言程序设计5.1.2 实现接口实现接口 例例5_4class Circle implements Shape2D double r

4、adius;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);l声明声明Circle与与Rectangle两个类实现两个类实现Shape2D接口接口接口707信管JAVA语言程序设计l测试类测试类public clas

5、s 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();l运行结果运行结果Area of rect=30.0Area of cir=12.565.1.2 实现接口实现接口 例例5_4运行结果运行结果接口807信管JAVA语言程序设计l声明接口类型的变

6、量,并用它来访问对象声明接口类型的变量,并用它来访问对象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();l输出结果输出结果Area of var1=30.0Ar

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

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

9、e2D /声明Shape2D接口 final double pi=3.14;/数据成员一定要初始化 public abstract double area();/抽象方法interface Color void setColor(String str);/抽象方法5.1.3 接口的作用接口的作用-多重继承多重继承 例例5_6接口1307信管JAVA语言程序设计class Circle implements Shape2D,Color /实现Circle类 double radius;String color;public Circle(double r)/构造方法 radius=r;publi

10、c double area()/定义area()的处理方式 return(pi*radius*radius);public void setColor(String str)/定义setColor()的处理方式 color=str;System.out.println(color=+color);接口5.1.3 接口的作用接口的作用-多重继承多重继承 例例5_61407信管JAVA语言程序设计l测试类测试类public class MultiInterfaceTester public static void main(String args)Circle cir;cir=new Circle

11、(2.0);cir.setColor(blue);System.out.println(Area=+cir.area();l输出结果输出结果color=blueArea=12.56接口5.1.3 接口的作用接口的作用-多重继承多重继承例例5_6运行结果运行结果1507信管JAVA语言程序设计5.1.4 接口的继承(扩展)接口的继承(扩展)l接口的继承接口的继承子接口继承父接口。接口继承的语法,支持多重继承interface 子接口extends 父接口1,父接口2,实现接口的类也必须实现此接口的父接口接口1607信管JAVA语言程序设计lShape是父接口,是父接口,Shape2D与与Shap

12、e3D是其子接是其子接口。口。Circle类及类及Rectangle类实现接口类实现接口Shape2D,而而Box类及类及Sphere类实现接口类实现接口Shape3D 5.1.4 接口的扩展接口的扩展 例例5_7Shape接口接口Shape2D接口接口Shape3D接口接口Sphere类类Box类类Rectangle类类Circle类类接口1707信管JAVA语言程序设计l部分代码如下部分代码如下/声明Shape接口interface Shape double pi=3.14;void setColor(String str);/声明Shape2D接口扩展了Shape接口interface

13、Shape2D extends Shape double area();5.1.4 接口的扩展接口的扩展 例例5_7接口1807信管JAVA语言程序设计class 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.out.println(color=+color);public class

14、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接口1907信管JAVA语言程序设计l运行结果运行结果color=blueArea=12.56l说明说明首先声明了父接口Shape,然后声明其子接口Shape2D之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与

15、area()方法的处理方式最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法5.1.4 接口的扩展接口的扩展 例例5_7运行结果运行结果接口2007信管JAVA语言程序设计5.2 塑型塑型l塑型塑型(type-casting)type-casting)又称为类型转换方式l隐式(自动)的类型转换l显式(强制)的类型转换2107信管JAVA语言程序设计5.2.1 塑型的概念塑型的概念l塑型的对象包括塑型的对象包括基本数据类型l将值从一种形式转换成另一种形式对象l只能被塑型为父类类型对象所属的类实现的接口被塑型为父类或接口后

16、,再被塑型回其本身塑型2207信管JAVA语言程序设计lManager对象对象可以被塑型为Employee、Person、Object或Insurable,不能被塑型为Customer、Company或Car ObjectPersonEmployeeCustomerManagerCompanyCarInsurable5.2.1 塑型的概念塑型的概念 一个例子一个例子塑型2307信管JAVA语言程序设计l基本数据类型基本数据类型相容类型之间存储容量低的自动向存储容量高的类型转换l对象对象被塑型成父类Employee emp;emp=new Manager();/将Manage对象塑型为Emplo

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

18、塑型为本来的类型塑型2507信管JAVA语言程序设计5.2.2 塑型的应用塑型的应用l塑型应用的场合包括塑型应用的场合包括赋值转换l赋值号右边的表达式类型或对象转换为左边的类型方法调用转换l实参的类型转换为形参的类型算数表达式转换l算数混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换l字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串 塑型2607信管JAVA语言程序设计l当一个类对象被塑型为其父类后,它提供的方法会当一个类对象被塑型为其父类后,它提供的方法会减少减少当Manager对象被塑型为Employee之后,它只能接收getName(

19、)及getEmployeeNumber()方法,不能接收getSalary()方法将其塑型为本来的类型后,又能接收getSalary()方法了5.2.2 塑型的应用塑型的应用塑型2707信管JAVA语言程序设计5.2.3 方法的查找方法的查找l如果在塑型前和塑型后的类中都提供如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪塑型后的对象,那么系统将会调用哪一个类中的方法一个类中的方法?实例方法的查找类方法的查找塑型2807信管JAVA语言程序设计l从对象创建时的类开始,沿类层次向上查从对象创建时的类开始,沿类层次向上

20、查找找 Manager manManager man=new Manager();=new Manager();Employee emp1Employee emp1=new Employee();=new Employee();Employee emp2Employee emp2=(Employee)man;=(Employee)man;emp1emp1putePay();putePay();/调用调用EmployeeEmployee类中的类中的computePay()computePay()方法方法 manmanputePay();putePay();/调用调用ManagerManager类

21、中的类中的computePay()computePay()方法方法 emp2emp2putePay();putePay();/调用调用ManagerManager类中的类中的computePay()computePay()方法方法 5.2.3 方法的查找方法的查找 实例方法的查找实例方法的查找塑型2907信管JAVA语言程序设计l总是在引用变量声明时所属的类中进行查总是在引用变量声明时所属的类中进行查找找 Manager manManager man=new Manager();=new Manager();Employee emp1Employee emp1=new Employee();=

22、new Employee();Employee emp2Employee emp2=(Employee)man;=(Employee)man;manman.expenseAllowance();/in Manager.expenseAllowance();/in Manager emp1emp1.expenseAllowance();/in Employee.expenseAllowance();/in Employee emp2emp2.expenseAllowance();/in Employee!.expenseAllowance();/in Employee!5.2.3 方法的查找方法

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

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

25、了一个通用接口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多态的概念3407信管JAVA语言程序设计class Square extends Shape void draw()System.out.println(Square.dra

26、w();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多态的概念3507信管JAVA语言程序设计l对动态绑定进行测试如下对动态绑定进行测试如下public class BindingTester public static void main(String args)

27、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多态的概念3607信管JAVA语言程序设计l运行结果运行结果Square.draw()l说明说明编译时无法知道s数组元素的具体类型,运行时才能确定类型,所以是动态绑定在主方法的循环体中,每次随机生成指向一个Circle、Square或者Triangle的引用5.

28、3.2 动态绑定动态绑定 例例5_8运行结果运行结果多态的概念3707信管JAVA语言程序设计5.4 多态的应用多态的应用 l多态的应用多态的应用技术基础l向上塑型技术:一个父类的引用变量可以指向不同的子类对象l动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性多态的概念3807信管JAVA语言程序设计l声明一个抽象类声明一个抽象类Driver及两个子类及两个子类FemaleDriver及及MaleDriverl在在Diver类中声明了抽象方法类中声明了抽象方法drives,在两在两个子类中对这个方法进行了重写个子类中对这个方法进行了重写public ab

29、stract class Driverpublic Driver()public abstract void drives();5.4 多态的应用多态的应用(续续)例例5_9多态的概念3907信管JAVA语言程序设计public 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

30、()public void drives()System.out.println(A male driver drives a vehicle.);5.4 多态的应用多态的应用(续续)例例5_9多态的概念4007信管JAVA语言程序设计public class Test1static 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 dri

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

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

33、icle及其子类声明如下及其子类声明如下public abstract class Vehicleprivate String type;public Vehicle()public Vehicle(String s)type=s;public abstract void drivedByFemaleDriver();public abstract void drivedByMaleDriver();5.4 多态的应用多态的应用(续续)例例5_9改进改进多态的概念4407信管JAVA语言程序设计public class Bus extends Vehicle public Bus()publi

34、c 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()System.out.println(A Female driver drives a car.);public void

35、drivedByMaleDriver()System.out.println(A Male driver drives a car.);5.4 多态的应用多态的应用(续续)例例5_9改进改进多态的概念4507信管JAVA语言程序设计l对对FemaleDriver及及MaleDriver类中的类中的drives方法进方法进行改进,在行改进,在drives方法的定义体中不直接输出结果,方法的定义体中不直接输出结果,而是调用而是调用Bus及及Car类中的相应方法类中的相应方法public abstract class Driver public Driver()public abstract voi

36、d drives(Vehicle v);public class FemaleDriver extends Driverpublic FemaleDriver()public void drives(Vehicle v)v.drivedByFemaleDriver();public class MaleDriver extends Driverpublic MaleDriver()public void drives(Vehicle v)v.drivedByMaleDriver();5.4 多态的应用多态的应用(续续)例例5_9改进改进多态的概念4607信管JAVA语言程序设计l运行结果运行结

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

38、计l构造方法的执行顺序构造方法的执行顺序执行基类的构造方法,基类成员变量初始化。执行派生构造方法,派生类成员变量初始化。5.5.1 构造方法的执行顺序构造方法的执行顺序构造方法与多态4907信管JAVA语言程序设计l构建一个点类构建一个点类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 toS

39、tring()return“x轴坐标为”+x+”y轴坐标为”+y;5.5.1 构造方法的执行顺序构造方法的执行顺序(续续)例例5_10构造方法与多态5007信管JAVA语言程序设计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(dou

40、ble 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构造方法与多态5107信管JAVA语言程序设计public class MovingBall extends Ball private double speed;public MovingBall()public MovingBal

41、l(double x1,double y1,double r,String c,double s)super(x1,y1,r,c);speed=s;public String toString()return super.toString()+“,速度 +speed);5.5.1 构造方法的执行顺序构造方法的执行顺序(续续)例例5_10构造方法与多态5207信管JAVA语言程序设计public class Testerpublic static void main(String args)MovingBall mb=new MovingBall(10,20,40,green,25);Syste

42、m.out.println(mb);l运行结果运行结果球中心点x轴坐标为10,y轴坐标为20,半径为 40.0,颜色为green,速度为25.0 5.5.1 构造方法的执行顺序构造方法的执行顺序(续续)例例5_10运行结果运行结果构造方法与多态5307信管JAVA语言程序设计l构造方法中的多态方法构造方法中的多态方法 在父类构造方法内调用重写的方法(子类动态绑定的方法)。这种情况要避免出现。构造方法与多态5.5.2 构造方法中的多态方法构造方法中的多态方法5407信管JAVA语言程序设计构造方法与多态l在在Shap2D中声明一个抽象方法,并在构造中声明一个抽象方法,并在构造方法内部调用之方法内

43、部调用之abstract class Shap2D abstract void draw();Shap2D()System.out.println(“Shap2D的构造方法执行);draw();System.out.println(“Shap2D的构造方法结束);5.5.2 构造方法中的多态方法构造方法中的多态方法(续续)例例5_125507信管JAVA语言程序设计class Circle extends Shap2D int radius=1;Circle(int r)radius=r;System.out.println(“Circle的构造方法的构造方法,半径半径=+radius);vo

44、id draw()System.out.println(“Circle的的draw方法方法,半径半径=+radius);public class PolyConstructors public static void main(String args)new Circle(5);5.5.2 构造方法中的多态方法构造方法中的多态方法(续续)例例5_12构造方法与多态5607信管JAVA语言程序设计l运行结果运行结果 Shap2D的构造方法执行的构造方法执行 Circle的的draw方法方法,半径半径=0 Shap2D的构造方法结束的构造方法结束 Circle的构造方法的构造方法,半径半径=5构造方法与多态5.5.2 构造方法中的多态方法构造方法中的多态方法(续续)例例5_12运行运行结果结果57

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!