《Java程序设计课件Java程序设计 (5).pdf》由会员分享,可在线阅读,更多相关《Java程序设计课件Java程序设计 (5).pdf(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java语言程序设计(第2版)第 4 章 接口与多态BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMC+语言程序设计(第4版),郑莉,清华大学清华大学 郑莉JAVA语言程序设计(讲课提示,不显示)2BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
2、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学3目录 4.1 接口 4.2 类型转换 4.3 多态的概念 4.4 多态的应用 4.5 构造方法与多态BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMM
3、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口(文字显示)(以下文字不显示)就像“纯”的抽象类,只有设计、没有实现;可以同时继承多个设计;可以在没有继承、组合关系的类之间抽象出共同接口;可以隐藏实现细节。4BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
4、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换(文字显示)(以下文字不显示)继承超类和实现接口的目的不仅在于重用设计和实现,而且可以规定不同类的对象有统一的对外服务接口。从提供同样服务接口的角度 子类对象可以充当超类的对象;实现接口类的对象可以通过接口类型的引用访问。5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
5、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学多态性(文字显示)(以下文字不显示)超类和接口中设计的对外服务功能,在不同的子类或实现接口的类中可以有不同的实现,但是可以通过超类的引用或者接口的引用访问。6BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
6、MMMMMMMMMMMMMMMMMMMMMC+语言程序设计(第4版),郑莉,清华大学清华大学 郑莉JAVA语言程序设计(讲课提示,不显示)7BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口 可以看做是一个“纯”抽象类,它只提供一种形式,并不提供实现8BBB
7、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口 接口中可以规定方法的原型:方法名、参数列表以及返回类型,但不规定方法主体;也可以包含基本数据类型的数据成员,但它们都默认为static和final。9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
8、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学10接口的作用 是面向对象的一个重要机制BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMM
9、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学11接口的作用 继承多个设计。建立类和类之间的“协议”将类根据其实现的功能分组用接口代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节;实现不同类之间的常量共享。BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
10、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口允许我们在看起来不相干的对象之间定义共同行为(此行文字不显示)12ObjectFoodWeatherComponentFruitVegetableCloudRainSnowEdiblefeedTo(aPerson)BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
11、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口的语法 声明格式为接口修饰符 interface 接口名称 extends 父接口名/方法的原型声明或静态常量 接口的数据成员一定要有初值,且此值将不能再更改,可以省略final关键字。接口中的方法必须是“抽象方法”,不能有方法体,可以省略public及abstract关键字。13BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
12、BBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:接口声明 声明一个接口Shape2D,包括和计算面积的方法原型interface Shape2D/声明Shape2D接口final double pi=3.14;/数据成员一定要初始化public abstract double area();/抽象方法 在接口的声明中,允许省略一些关键字,也可声明如下interface Shape2D double pi=3.14;double area();BBBBBBBBBBBBBBB
13、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学实现接口 不能用new运算符直接产生接口对象;15BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMM
14、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学实现接口 利用接口设计类的过程,称为接口的实现,使用implements关键字,语法如下:public class 类名称 implements 接口名称 /在类体中实现接口的方法/本类声明的更多变量和方法注意:必须实现接口中的所有方法;来自接口的方法必须声明成public。16BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
15、BBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:实现接口Shape2Dclass Circle implements Shape2Ddouble radius;public Circle(double r)radius=r;public double area()return(pi*radius*radius);class Rectangle implements Shape2Dint width,height;publi
16、c Rectangle(int w,int h)width=w;height=h;public double area()return(width*height);BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:实现接口Shape2D 测试类public class InterfaceTester p
17、ublic 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();运行结果Area of rect=30.0Area of cir=12.56BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
18、BBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:接口类型的引用变量 声明接口类型的变量,并用它来访问对象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);Syste
19、m.out.println(Area of var2=+var2.area();运行结果Area of var1=30.0Area of var2=12.56BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学实现多个接口的语法20BBBBBBBBBBBBBBBB
20、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学实现多个接口的语法 Java不允许一个类有多个超类(这一行不显示)一个类可以实现多个接口,通过这种机制可实现对设计的多重继承。实现多个接口的语法如下类修饰符 class 类名称 implements 接口1,接口2,21BBBBBBBBBBBB
21、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:通过实现接口达到多重继乘 声明Circle类实现接口Shape2D和Color Shape2D具有常量pi与area()方法,用来计算面积;Color则具有setColor方法,可用来赋值颜色;通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了对设计进行多重
22、继承的目的。interface Shape2D /声明Shape2D接口final double pi=3.14;/数据成员一定要初始化public abstract double area();/抽象方法interface Colorvoid setColor(String str);/抽象方法BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
23、MMMMMMMMMMMMMMMMMMMM例:通过实现接口达到多重继乘class 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);BB
24、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:通过实现接口达到多重继乘 测试类public class MultiInterfaceTesterpublic static void main(String args)Circle cir;cir=new Circle(2.0);cir.setColor(
25、blue);System.out.println(Area=+cir.area();输出结果color=blueArea=12.56BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口的扩展 接口可通过扩展的技术派生出新的接口 原来的接口称为超接口(super
26、 interface);派生出的接口称为子接口(sub interface)。25BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学接口的扩展 实现一个接口的类也必须实现其超接口。接口扩展的语法interface 子接口的名称 extends 超口的名称1,超接
27、口的名称2,26BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学 Shape是超接口,Shape2D与Shape3D是其子接口。Circle类及Rectangle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D(此行文字不显示)27S
28、hape接口接口Shape2D接口接口Shape3D接口接口Sphere类类Box类类Rectangle类类Circle类类BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:接口的扩展 部分代码如下/声明Shape接口interface Shape double pi=3.14;void setColo
29、r(String str);/声明Shape2D接口扩展了Shape接口interface Shape2D extends Shape double area();BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:接口的扩展class Circle implements Shape2D double r
30、adius;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.setColor(blue);Sys
31、tem.out.println(Area=+cir.area();BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM例:接口的扩展 运行结果color=blueArea=12.56 说明首先声明了父接口Shape,然后声明其子接口Shape2D;之后声明类Circle实现Shape2D子接口,因而在此类内必
32、须明确定义setColor()与area()方法的处理方式;最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法。BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学结语 这一节介绍了接口的
33、概念和作用、声明和实现接口的语法,以及接口的扩展31BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMC+语言程序设计(第4版),郑莉,清华大学清华大学 郑莉JAVA语言程序设计(讲课提示,不显示)32BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
34、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换的概念 又称为塑型(type-casting)。转换方式 隐式的类型转换;显式的类型转换。转换方向 向上转型;向下转型。33BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMM
35、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换规则 基本类型之间的转换 将值从一种类型转换成另一种类型。引用变量的类型转换 将引用转换为另一类型的引用,并不改变对象本身的类型。只能被转为 任何一个(直接或间接)超类的类型(向上转型);对象所属的类(或其超类)实现的一个接口(向上转型);被转为引用指向的对象的类型(唯一可以向下转型的情况)。当一个引用被转为其超类引用后,通过他能够访问的只有在超类中声明过的方法。34BBBBBBBBBB
36、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换举例 Manager对象 可以被塑型为Employee、Person、Object或Insurable,不能被塑型为Customer、Company或Car35ObjectPersonEmployeeCustomerMana
37、gerCompanyCarInsurableBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学隐式类型转换36BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
38、BBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学隐式类型转换 基本数据类型 可以转换的类型之间,存储容量低的自动向存储容量高的类型转换。引用变量 被转成更一般的类,例如:Employee emp;emp=new Manager();/将Manager类型的对象直接赋给/Employee类的引用变量,系统会/自动将Manage对象塑型为Employee类 被塑型为对象所属类实现的接口类型,例如:Car jett
39、a=new Car();Insurable item=jetta;37BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学显式类型转换 基本数据类型(int)871.34354;/结果为 871(char)65;/结果为A(long)453;/结果为453L 引用
40、变量Employee emp;Manager man;emp=new Manager();man=(Manager)emp;/将emp显式转换为它指向的对象的类型38BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换的主要应用场合 赋值转换 方法调用转换
41、 算术表达式转换 字符串转换39BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换的主要应用场合 赋值转换 赋值运算符右边的表达式或对象类型转换为左边的类型;方法调用转换 实参的类型转换为形参的类型;算术表达式转换 算数混合运算时,不同类型的操作数转换为
42、相同的类型再进行运算;字符串转换 字符串连接运算时,如果一个操作数为字符串,另一个操作数为其他类型,则会自动将其他类型转换为字符串。40BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换的应用举例41BBBBBBBBBBBBBBBBBBBBBBBBBBB
43、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类型转换的应用举例(以下文字不显示,只显示图,图重画一下不要蓝色底色)当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法(都是在其直接或间接超类中声明过的方法),不能接收getSalary()方
44、法(Manager类中声明的方法);将其塑型为本来的类型后,又能接收getSalary()方法了。42BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMC+语言程序设计(第4版),郑莉,清华大学清华大学 郑莉JAVA语言程序设计(讲课提示,不显示)43BBBBBBBBBBBBBBBBBBBBBBBBBBBB
45、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学方法的查找 如果在塑型前和塑型后的类中都提供了相同原型的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法?44BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
46、BBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学方法的查找 实例方法的查找 类方法的查找45BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
47、MMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学实例方法的查找 从对象创建时的类开始,沿类层次向上查找。46ManagerManagermanman=new Manager();=new Manager();EmployeeEmployee emp1emp1=new Employee();=new Employee();EmployeeEmployee emp2emp2=(Employee)man;=(Employee)man;putePay();.computePay();/调用调用EmployeeEmployee类中的类中的computePaycompu
48、tePay()()方法方法putePputePay();();/调用调用ManagerManager类中的类中的computePaycomputePay()()方法方法putePay();.computePay();/调用调用ManagerManager类中的类中的computePaycomputePay()()方法方法ObjectPersonEmpioyeeManaerComputepay()Computepay()BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
49、BMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJava语言程序设计(第2版),郑莉,清华大学类方法的查找 总是在引用变量声明时所属的类中进行查找。47Manager manManager man=new Manager();=new Manager();Employee emp1Employee emp1=new Employee();=new Employee();Employee emp2Employee emp2=(Employee)man;=(Employee)man;
50、manman.expenseAllowance.expenseAllowance();/in Manager();/in Manager emp1emp1.expenseAllowance();/in Employee.expenseAllowance();/in Employee emp2emp2.expenseAllowance();/in Employee!.expenseAllowance();/in Employee!ObjectPersonEmpioyeeManagerStaticexpenseAllowance()StaticexpenseAllowance()BBBBBBBBB