




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 多 态 性,学习目标,理解多态性的概念 理解继承层次结构中对象间的关系 区分抽象类与具体类 抽象类和抽象方法的声明和使用 接口的声明和实现 final类和final方法 嵌套类的概念和使用 基本数据类型的包装类,6.1 多态性概念和实例,多态性(Polymorphism)是指在超类中定义的属性或行为,被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在超类及其各个子类中具有不同的语义。 例如:定义一个几何图形类Shape,它具有“画图”行为,用draw()表示。但具体画什么图并不确定;定义Shape类的一些子类如Circle圆和Rectangle矩形。在子
2、类中“画图”的具体行为可重新定义为:圆类中draw()画圆,矩形类中draw()画矩形。定义Shape s;s作为引用变量可指向Circle圆类的对象,也可指向Rectangle矩形类的对象。通过执行下面的代码: s.draw(); /s调用draw()方法,s指向对象不同会画出不同的图形(圆或矩形) 多态性也是泛指在程序中同一个符号在不同的情况下具有不同解释的现象。,6.1 多态性概念和实例(续),实现多态性的条件: 继承 抽象方法 引用,6.2 继承层次结构中对象间的关系,继承层次结构中的子类对象可以视为超类的对象,这样就可以将子类对象赋给超类变量。尽管子类对象的类型不同,但这么做是允许的
3、,因为每个子类对象就是超类的对象。 然而,超类对象并不是其任何子类的对象,即不能将超类对象赋给子类引用。,6.2 继承层次结构中对象间的关系(续),例如 Point3 point = new Point3( 30, 50 ); Circle4 circle = new Circle4( 120, 89, 2.7 ); Point3 pointRef = circle; (允许) Point3 pointRef=new Circle4(120,12,0) (允许) pointRef.toString(); /call Circle4.toString(); pointRef=point; poi
4、ntRef.toString() /call Point.toString(); Circle circle= point; / 不允许,编译出错,下列语句组是将point对象强制转换成Circle对象,circle. getX() 语句是正确的,而circle. getRadius()语句在运行时会产生错误。因为circle引用指向的point对象根本无getRadius方法。 Circle circle=(Circle) point; circle. getX() ; circle. getRadius() ; /run-time error 例6-1中的例子举例说明了继承层次结构中对象间
5、的关系。 例6-2 超类对象的引用赋给一个子类类型的变量,6.2 继承层次结构中对象间的关系 (续),6.3 抽象类和抽象方法,6.3.1 抽象类和具体类的概念 6.3.2 抽象方法的声明 6.3.3 抽象类的声明 6.3.4 抽象类程序设计的举例,6.3.1 抽象类和具体类的概念,每个抽象类中至少包含一个抽象方法。 抽象类只能作为继承层次结构中的超类,所以这些类称为抽象超类。不能实例化抽象类的对象。 抽象类的目的是提供一个合适的超类,以派生其他类。 用于实例化对象的类称为具体类。这种类实现它们声明的所有方法。抽象超类是一般类,它们仅仅指定子类的共同点,并不创建出真实的对象。在创建对象之前,我
6、们需要更为专业化的类。 例如,如果我们要“绘制形状”,那我们将绘制什么形状呢?具体类为实例化对象提供了合理的细节。,6.3.2 抽象方法的声明,使用关键字abstract声明抽象方法,形如: public abstract void draw(); 抽象方法并不提供实现。包含抽象方法的类必须声明为抽象类。抽象超类的所有具体子类都必须为超类的抽象方法提供具体实现。,6.3.3 抽象类的声明,使用关键字abstract声明抽象类。形如: public abstract class Shape 抽象类通常包含一个或多个抽象方法(静态方法不能为抽象方法)。 抽象超类不能实例化。但可以使用抽象超类来声明
7、变量,用以保存抽象类所派生的任何具体类的对象的引用。程序通常使用这种变量来多态地操作子类对象。,6.3.4 抽象类程序设计的举例,例6-3 抽象类的程序设计示例该例子所使用到的类的层次结构如图6-1所示。类的层次以抽象超类Shape为开始,派生出Point类,然后由Point类派生出Circle类,再由Circle类派生出Cylinder类。其中Shape以斜体字出现表示它是抽象类。,图6-1 Shape类的层次结构,6.4 接口的声明和实现,6.4.1 接口的概念 6.4.2 接口的声明 6.4.3 接口的实现 6.4.4 接口的程序设计举例,6.4.1 接口的概念,在Java中接口主要用于
8、声明一组类的公共操作的接口。 接口由常量和一组抽象方法组成。接口中不包括变量和有具体实现的方法。 接口支持多重继承,是指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的属性。在Java中,出于简化程序结构的考虑,不直接支持类间的多重继承。然而在解决实际问题的过程中,往往需要这种机制。 需要特别说明的是,接口只是定义了行为的协议,没有定义履行接口协议的具体方法。也就是说,接口定义的仅仅是实现某一特定功能的一组功能的对外协议和规范,而并没有真正地实现这个功能,这个功能的真正实现是在继承这个接口的各个类中完成的,要由这些类来具体定义接口中各抽象方法的方法体,以适合某些特定的行为。因而
9、在Java中,通常把对接口功能的继承称为“实现(implement)”。,因为接口是简单的、未实现的一些抽象的方法,我们可以考究一下接口与抽象类到底有什么区别?它们之间的区别有: (1)接口不能实现任何方法,而抽象类可以。 (2)类可以实现许多接口,但只有一个父类。 (3)接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。,6.4.1 接口的概念(续),6.4.2 接口的声明,定义接口的一般格式如下: public interface 接口名 extends 父接口名列表 public final static 类型 变量名=常量值; /常量声明 public abstract 返回
10、类型 方法名(参数列表); /抽象方法声明 ,像类可以被继承一样,接口也具有继承性,它将继承父接口的所有属性和方法。但是,类只能继承一个另外的类,而接口可以继承多个父接口。在“父接口名列表”中以逗号分隔所有的父接口名,这些接口可以被新的接口所继承。 接口的定义举例如下: public interface StockWatcher final String sunTicker=SUNW; final String oracleTicker=ORCL; final String ciscoTicker=CSCO; void valueChanged(String tickerSymbol,doub
11、le newValue); ,6.4.2 接口的声明(续),6.4.3 接口的实现,为了使用接口,要编写实现接口的类。如果一个类实现一个接口,那么这个类就应提供在接口中声明的所有方法的实现。那么这个类才是具体的类,否则它还是一个抽象的类。具体的类才能用来定义对象,抽象的类是不能实例化的。 一个接口定义了行为的协议。一个类可以根据定义在接口中的协议来实现接口。为了声明一个类来实现一个接口,在类的声明中要包括一条implements语句。因为Java平台支持接口的多个继承,一个类可以实现多个接口,因此可以在implements后面列出由类实现的接口系列,这些接口以逗号分隔。,6.4.4 接口的程序
12、设计举例,下面举例说明接口的使用。该例子中各类之间的层次关系类似图6-1,仅仅区别在于用接口Shape替代了抽象超类Shape。 例6-4接口程序设计示例,6.5 final方法和final类,变量可以声明为final,说明该变量是常量,不能在声明后进行修改,并且在声明时必须对它进行初始化。 final修饰符也能用于声明方法和类。 子类不能重载超类中声明为final的方法。因为子类不可能重载private方法,所以声明为private的方法隐式地为final方法。声明为static的方法也隐式地为final方法,因为只能重载非静态方法。 声明为final的类不能为超类。final类中所有方法都
13、隐式地为final方法。 String类是final类的一个例子。不能扩展该类,使用字符串的程序可以调用String对象在Java API中指定的函数。将类声明为final还可以防止程序员创建绕过安全限制的子类。,6.6 嵌套类,6.6.1 内部类的概念 6.6.2 内部类的声明 6.6.3 匿名内部类声明 6.6.4 嵌套类的程序设计举例,6.6.1 内部类的概念,嵌套在其它类里面的类称为内部类(inner class)。内部类主要用于事件处理。,6.6.2 内部类的声明,内部类的声明格式如下: 修饰符 class outerClass 修饰符 class innerClass ,6.6.3
14、 匿名内部类声明,匿名内部类:是指定义的内部类没有类名,所以当程序中使用匿名内部类时,在定义匿名内部类的地方创建该类的一个对象。匿名内部类的声明格式如下: new ClassName() 通过以上格式直接创建ClassName类的一个对象。ClassName后面的小括号表示调用这个匿名内部类的默认构造函数。而小括号后面的一对大括号中的内容为该匿名内部类的定义。匿名内部类的使用可参见下节。,6.6.4 嵌套类的程序设计举例,下面通过实例来说明嵌套类的程序设计。该程序包含两个文件Time.java文件和TimeTestWindow.java文件。Time.java文件定义了一个Time类。在Tim
15、eTestWindow.java文件中定义了一个内部类ActionEventHandler和一个匿名内部类。通过内部类和匿名内部类来处理用户对时间的设置事件。 例6-5 嵌套类的程序设计示例,在声明和使用嵌套类时,应该注意以下事项: (1)包含嵌套类的类在编译时,将为每个类产生单独的.class文件。嵌套类文件名为OuterClassName$InnerClassName.class。匿名内部类的文件名为OuterClassName$#.class,#从1开始,编译时,每遇到一个匿名内部类,#递增1。 (2)带有名称的内部类可以声明为public、protected、包访问或private,并
16、且它们的使用限制与其他类成员相同。 (3)内部类能以OuterClassName.this的形式访问其外部类的this引用。 (4)外部类负责创建内部类的对象。为创建另一个类的内部类对象,首先创建该外部类的一个对象,并将该对象的引用赋给外部类类型的变量(我们假设它是outref)。然后使用如下形式创建内部类的对象: OuterClassName.InnerClassName innerRef=outref.new InnerClassName(); (5)静态嵌套类不需创建外部类的对象,静态嵌套类不能访问外部类的非静态成员。,6.6.4 嵌套类的程序设计举例(续),6.7 基本数据类型的包装类
17、,在Java中,类型分成两类:基本类型和引用类型。 基本类型包括:boolean、char、byte、short、int、long、float和double。 每个基本类型都有一个相应的位于java.lang包中的包装类。每个包装类使你能够像操作对象一样操作基本类型。 基本类型boolean、char、byte、short、int、long、float和double对应的包装类:Boolean、Char、Byte、Short、Int、Long、Float和Double。每个包装类均声明为final,因此它们的方法隐式地为final方法,并且不能重载这些方法。许多处理基本类型的方法一般声明为类型包装类的静态方法。如果程序需要操作基本类型的值,可以通过类名来调用这些静态方法。,6.7 基本数据类型的包装类(续),例如,以下代码是将一个字符串转变为一个double值: String str=”28.8”;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业园区花卉管理办法
- 临时特价仓储管理办法
- 企业房屋出售管理办法
- 优化环境测评管理办法
- 交换空间装饰管理办法
- 企业人事招聘管理办法
- 企业维修售后管理办法
- 乡镇文化设施管理办法
- 交通渣土运输管理办法
- 新能源商用车辆在冷链物流冷链配送设施的市场需求与应用场景报告
- 2014红星美凯龙建材品类系列知识培训:卫浴篇
- 2023年海口市自然资源局事业单位招聘考试笔试模拟试题及答案解析
- GA/T 1323-2016基于荧光聚合物传感技术的痕量炸药探测仪通用技术要求
- 2023年苏州国发创业投资控股有限公司招聘笔试题库及答案解析
- 护士注册健康体检表下载【可直接打印版本】
- 高中历史《第一次工业革命》说课课件
- 学生集体外出活动备案表
- 叉车检验检测报告
- DNF装备代码大全
- 基于Qt的俄罗斯方块的设计(共25页)
- 食堂投诉处理方案
评论
0/150
提交评论